قسمت -2: آموزش تخصصی ویژگی های Azure

قسمت -2: آموزش تخصصی ویژگی های Azure


معرفی

به وبلاگ عالی دیگری که شخصاً توسط کارشناسان DEV IT ما گردآوری شده است، خوش آمدید. وبلاگ قبلی، راهنمای سریع ویژگی های Azure، به شرح ویژگی های Azure می پردازد و موضوعاتی از جمله:

  • ویژگی Azure چیست؟
  • بدون سرور چیست؟
  • نمونه ای از تابع Azure

وبلاگ دیگری در این سایت موضوعاتی را در مورد “استفاده از Injector Builder برای استقرار DI در Microsoft Azure” پوشش می دهد. این یکی دیگر از وبلاگ های مهم در مورد پروژه های عملکرد Azure است و برای اطمینان از یکپارچگی کد شما در حین کار بر روی پروژه عملکرد Azure ضروری است. این پست جدید اکنون به موضوعات تزریق وابستگی برای ویژگی‌های Azure V2 و V3 می‌پردازد. ما در حال حاضر به دنبال V1 نخواهیم بود، اما اگر می خواهید یک وبلاگ در مورد آن داشته باشید، لطفاً یک نظر در زیر بنویسید و من به زودی یکی را ارسال خواهم کرد.

بنابراین، بیایید بلافاصله به آن بپردازیم. این وبلاگ محرک های مختلفی را برای اجرای ویژگی های Azure پوشش می دهد.

تریگر آزور چیست؟

ماشه تابع لاجوردی مکانیزمی است که توسط آن می توان تابع را (به صورت دستی یا خودکار) فراخوانی کرد. به محرک به عنوان یک رویداد فکر کنید. هنگامی که رویداد رخ می دهد، تابع را با داده های مناسب فراخوانی می کند تا تابع Azure زمینه کافی برای تصمیم گیری را پیدا کند.

انواع مختلفی از محرک ها وجود دارد که ویژگی Azure در خارج از جعبه از آنها پشتیبانی می کند که در این پست وبلاگ به آنها خواهیم پرداخت. و اگر متوجه شدید که نیاز شما هیچ یک از محرک های موجود پشتیبانی شده توسط جعبه را برآورده نمی کند، نگران نباشید. نمونه ای از یک تریگر سفارشی را خواهیم دید و خواهیم دید که چگونه یک تریگر سفارشی می تواند پیاده سازی شود.

محرک های پشتیبانی شده برای ویژگی Azure

معمولاً در هر پروژه از محرک های زیر استفاده می شود:

  • HTTP و قلاب های وب
  • تایمر
  • ذخیره سازی وبلاگ
  • ذخیره سازی میز
  • ذخیره سازی دم
  • اتوبوس خدماتی
  • شبکه ای از رویدادها
  • مرکز رویداد

Http و قلاب های وب

راه‌انداز HTTP & webhooks برای فراخوانی یک تابع لاجوردی با برقراری تماس HTTP است. یعنی می توانید یک API بدون سرور ایجاد کنید یا با API های خود به عنوان یک قلاب یکپارچه سازی شخص ثالث رفتار کنید.

که در قسمت 1، نمونه ای از تابع لاجوردی HTTPTrigger را با استفاده از مثال HelloWorld دیدیم. پس از پیاده سازی، دیدیم که تابع می تواند در http: // localhost: 7071: // api / helloworldfunction فراخوانی شود.

در اینجا مواردی وجود دارد که هنگام اجرای ویژگی HTTP Trigger باید در نظر داشته باشید:

اتصال HTTP تمام شد

اگر HTTP API را با استفاده از HTTPClient در تابع HTTPTriger خود فراخوانی کنید، ممکن است با مشکل تخلیه پورت مواجه شوید که می توانید با به اشتراک گذاری اشیاء HTTPClient در چندین پیاده سازی عملکرد آن را حل کنید. راه های دیگری نیز وجود دارد که در اینجا با جزئیات بیشتر توضیح داده شده است – مدیریت اتصال HTTP در توابع Azure.

محافظت از ویژگی HTTP Trigger

به طور پیش فرض، ویژگی فعال کردن HTTP به اتصالات ناشناس اجازه می دهد. یعنی هر کسی با URL می تواند ویژگی ما را درخواست کند. این را می توان به چند روش حل کرد:

1. از کلیدهای تابع استفاده کنید – با استفاده از این کلید، فقط می توانید عملکرد Azure مربوطه را فراخوانی کنید.

2. از کلیدهای میزبان استفاده کنید – با استفاده از این کلید، می توانید تمام عملکردهای یک سرویس برنامه را فراخوانی کنید.

3. از کلیدهای اصلی استفاده کنید – با استفاده از این کلید می توانید به تمامی ویژگی ها و همچنین به API مدیریت ویژگی های Azure و سرویس اپلیکیشن دسترسی داشته باشید.

4. از مکانیزم احراز هویت سرویس برنامه استفاده کنید – Azure Application Service (ویژگی یا برنامه وب) دارای پشتیبانی داخلی برای احراز هویت و نقاط پایانی مجوز است. می‌توان از ASP.NET Identity تحت تابع لاجوردی برای مدیریت هویت‌ها و تولید توکن‌ها استفاده کرد و به میان‌افزار اجازه داد تا به سرویس برنامه اجازه دهد تا بخش مجوز را پردازش کند.

5. از سایر خدمات Azure مانند APIM استفاده کنید

6. مشابه با استفاده از مکانیسم احراز هویت، از قابلیت های مدیریت API می توان برای ایمن سازی API ها استفاده کرد.

از گزینه های پشتیبانی شده در بالا، اگر قصد دارید API را از طریق اینترنت در حال تولید در معرض دید قرار دهید، 4 و 5 روش پیشنهادی برای پیاده سازی هستند.

برای اطلاعات بیشتر در مورد «ارائه توابع محرک HTTP» اینجا را بخوانید.

یادداشت مهم: اگر تابع ماشه لاجوردی از کار بیفتد، زمان اجرای لاجورد تابع را دوباره امتحان نمی کند، یعنی. مکانیسم Retry در تابع TimerTrigger تعبیه نشده است.

تایمر

همانطور که از نام آن پیداست، ماشه تایمر اجازه می دهد تا یک تابع بر اساس زمان از پیش تعیین شده فراخوانی شود. عملکردی که با تایمر راه‌اندازی می‌شود به‌عنوان یک تابع زمان‌بندی شده در نظر بگیرید که می‌تواند هر روز در ساعت ۱۲ ظهر، هر دوشنبه در ساعت ۳:۰۰ صبح، یا هر ۳۰ دقیقه در روزهای دوشنبه، چهارشنبه، یعنی بسته به نموداری که تعریف می‌کنیم، عملکرد تایمر انجام شود. با اجرای تابع Azure اجرا می شود.

تریگر تایمر بر اساس عبارت NCRONTab اجرا می شود. به عنوان مثال، “0 * / 5 * * * *” یک عبارت کرون برای “هر 5 دقیقه یک بار” و “0 30 9 * Jan Mon” یک عبارت کرون برای “9:30 صبح هر دوشنبه در ژانویه است”.

توجه: بیان و زمان‌های CRON در ویژگی Azure (یا همه سرویس‌های لاجوردی) فقط بر اساس UTC هستند.

بیایید یک مثال را ببینیم:

[FunctionName("ScheduledImport")]
public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo timerRequest, ILogger logger)
{
    log.LogInformation($"Timer is running at {DateTime.UtcNow}!");
}

از مثال بالا می بینیم که TimerTrigger یک عبارت NCRON را به عنوان ورودی می گیرد و تصمیم می گیرد که چه زمانی تابع را اجرا کند. همچنین می توانید این عبارت را از فایل local.development.json دریافت کنید. TimerInfo را به عنوان یک پرس و جو ارسال می کند که به عنوان ویژگی هایی مانند:

  • ScheduleStatus.Last – آخرین بار برای انجام عملکرد لاجوردی
  • ScheduleStatus.Next – دفعه بعد برای اجرای تابع azure
  • IsPastDue – آیا این ویژگی دیرتر از زمان برنامه ریزی شده فعال می شود یا خیر.

یادداشت مهم: اگر تابع ماشه لاجوردی از کار بیفتد، زمان اجرای لاجورد تابع را دوباره امتحان نمی کند، یعنی. مکانیسم Retry در تابع TimerTrigger تعبیه نشده است.

ذخیره سازی Blob

عملکرد راه‌اندازی شده توسط Blog Storage زمانی اجرا می‌شود که زمان اجرای Azure یک لکه جدید/به‌روزرسانی شده را در یک ظرف پیکربندی شده شناسایی کند. از آنجایی که کشف نقاط جدید/به‌روزرسانی‌شده می‌تواند یک چالش عملکرد باشد، زمان اجرا Azure می‌تواند برخی از رویدادهایی را که می‌توانند باعث رفتار غیرمنتظره شوند نادیده بگیرد. یعنی تابع azure ممکن است برای رویدادهای blob اجرا نشود زیرا ممکن است از آنها صرفنظر شود.

بیایید یک مثال را ببینیم:

[FunctionName("ProfilePictureModify")]        
public static void Run([BlobTrigger("profile-pictures/{name}")] Stream blobRequest, string name, ILogger logger)
{
    log.LogInformation($"Function is executing for  blob name:{name} and Size: {myBlob.Length} Bytes");
}

یادداشت های مهم:

  • هنگامی که عملکرد ماشه حباب از کار می افتد، به طور خودکار تا 5 بار امتحان می کند. اگر هر پنج تلاش مجدد ناموفق باشد، مرجع اجرای blob به عنوان یک حباب سم به فروشگاه صف اضافه می شود. (یعنی لکه همانطور که در حساب ذخیره سازی هست باقی می ماند)
  • MaxDequeueCount تنظیمی است که می توان از آن برای امتحان مجدد استفاده کرد و به طور پیش فرض روی 5 تنظیم شده است.
  • به‌طور پیش‌فرض، 24 تابع blob را می‌توان به‌دلیل محدودیت پیش‌فرض به طور همزمان فعال کرد که می‌توان آن را در فایل host.json تغییر داد.

برای اطلاعات بیشتر در مورد نکات فوق اینجا را بخوانید – “استفاده از موازی سازی و حافظه”.

ذخیره سازی میز

ما به ذخیره سازی جداول با جزئیات بیشتری نگاه نمی کنیم، زیرا طرح ها شبیه به ذخیره سازی حباب ها با تفاوت های کوچک است که می توانید در اینجا بخوانید – Table Storage Trigger.

ذخیره سازی دم

صف فعال‌شده یکی از پرکاربردترین محرک‌های توابع لاجوردی است که کاملاً مشابه «ServiceBus»، «EventHub» و «EventGrid» هستند. بنابراین، نمونه‌هایی از نحوه اجرای Queue Trigger و سپس پوشش تفاوت‌های کلیدی بین سایرین را خواهیم دید.

توابع فعال شده توسط صف زمانی فراخوانی می شوند که پیام در فروشگاه صف موجود باشد.

بیایید مثالی بزنیم:

[FunctionName("SendNotificationForGroupCreation")]
public static void Run(
    [QueueTrigger("group creation notification queue", Connection = "StorageConnectionSetting")] string groupCreationRequest, 
    ILogger log)
{
    log.LogInformation($"Function is executing request for {groupCreationRequest}");
}

از مثال بالا، می بینید که هر بار که پیامی در صفی به نام “صف اعلان گروه” در حساب ذخیره سازی “StorageConnectionSetting” یافت می شود، تابع فراخوانی / اجرا می شود.

پرس و جوی ورودی می تواند یک رشته (کوئری ایجاد گروه) یا یک شی باشد (در این مورد زمان اجرا لاجوردی رشته را به نوع ارائه شده از حالت سریال خارج می کند).

یادداشت های مهم:

  • اگر یک تابع ناموفق باشد، azure runtime پنج تلاش را امتحان می‌کند و اگر همه تلاش‌ها با شکست مواجه شوند، زمان اجرای azure پیام را به صف Poison منتقل می‌کند، یعنی. {Original-Queue-Name} -poison.
  • اندازه دسته پیش فرض صف 16 است، یعنی. زمان اجرای Azure 16 پیام را از صف دریافت کرده و به صورت موازی اجرا می کند. این تنظیمات را می توان در فایل host.json تغییر داد.

تفاوت اصلی بین ماشه ذخیره سازی دم و ماشه باس سرویس:

  • در حالی که تابع راه‌انداز صف می‌تواند پیام‌های صف را بخواند، تابع راه‌انداز گذرگاه خدمات می‌تواند پیام‌ها و رشته‌های صف را بخواند.
  • تعداد دفعات تکرار برای ذخیره صف توسط تابع تعریف و پردازش می شود، در حالی که برای گذرگاه سرویس بر اساس تعداد تحویل پیام (و همچنین در سطح تابع) تعریف می شود.

جدول زیر را می توان به عنوان مرجعی برای انواع ماشه های پشتیبانی شده با توجه به نسخه Azure مشاهده کرد.

تایپ کنید 1.x 2.x و بالاتر ماشه ورود خروج
ذخیره سازی Blob
Azure Cosmos DB
داپر3
شبکه ای از رویدادها
مراکز رویداد
HTTP و قلاب های وب
مرکز اینترنت اشیا
کافکا 2
برنامه های موبایل
مراکز اطلاع رسانی
ذخیره سازی دم
RabbitMQ2
SendGrid
اتوبوس خدماتی
SignalR
ذخیره سازی میز
تایمر
تویلیو

ماشه سفارشی برای عملکرد Azure

در قسمت قبل انواع مختلفی از تریگرها را دیدیم که ویژگی Azure از آنها پشتیبانی می کند. اگر هیچ یک از آنها نیازهای شما را برآورده نکرد، می توانید یک ماشه سفارشی ذخیره کنید.

اساساً نوشتن یک پسوند سفارشی شامل دو بخش است:

  1. نوشتن ماشه – مسئول تماس است
  2. نوشتن صحافی – مسئول ارائه داده های لازم است.

بیایید یک اسکریپت برای نوشتن یک تابع لاجوردی در نظر بگیریم که بر اساس ایمیل دریافت شده در جعبه ایمیل شخصی انجام می شود. (پذیرش صرافی یا دفتر 365 در اینجا)

بیایید ابتدا Trigger را بنویسیم

[AttributeUsage(AttributeTargets.Parameter)]
[Binding]
public class OutlookTriggerAttribute: Attribute
{
    public string GraphConnectionString { get; set; }
    public string EmailId { get; set; }
    public string Password { get; set; }
    internal string GetOfficeGraphUri()
    {
        return Environment.GetEnvironmentVariable(GraphConnectionString );
    }
}

Now let’s implement a Listener responsible for reading messages:
public class OutlookListener: IListener
    {
        private readonly ITriggeredFunctionExecutor _executor;
        private readonly OutlookTriggerContext _context;
        public OutlookListener(ITriggeredFunctionExecutor executor, OutlookTriggerContext context)
        {
            _executor = executor;
            _context = context;
        }
        public void cancel()
        {
            if (_context == null || _context.Client == null) return;
            _context.Client.Disconnect();
        }

        public void Dispose()
        {
            _context.Client.Dispose();
        }


       public Task StartAsync(CancellationToken cancellationToken)
        {
            return Task.Factory.StartNew(() =>
            {
                while (true)
                {
                    wtoken.Token.ThrowIfCancellationRequested();
	        //_context.Client.GetMessages();
                   // … Get message from graph API an
                    var triggerData = new TriggeredFunctionData
                    {
                        TriggerValue = outlookMessagePayload
                    };
                    var task = _executor.TryExecuteAsync(triggerData, CancellationToken.None);
                    task.Wait();
                    Task.Wait(10000);
                }
            }, wtoken, TaskCreationOptions.LongRunning);
        }
        public Task StopAsync(CancellationToken cancellationToken)
        {
            return Task.Run(() =>{
                _context.Client.Disconnect();
            });
        }
    }
}

بیایید زمینه Outlook Trigger را اعمال کنیم.

public class OutlookTriggerContext
    {
        public OutlookTriggerAttribute TriggerAttribute;
        public GraphApiClient Client;

        public OutlookTriggerContext(OutlookTriggerAttribute  attribute, GraphApiClient client)
        {
            this.TriggerAttribute = attribute;
            this.Client = client;
        }
    }

اکنون Binding را برای ماشه Outlook خود پیاده سازی می کنیم

[assembly: WebJobsStartup(typeof(OutlookBinding.Startup))]
namespace WebJobs.Extension.Outlook
{
    public class OutlookBinding
    {
        public class Outlookup : IWebJobsStartup
        {
            public void Configure(IWebJobsBuilder builder)
            {
                builder.AddOutlookExtension();
            }
        }
    }
}

برای تکمیل باید متد AddOutlookExtension را اضافه کنیم

public static class OutlookWebJobsBuilderExtensions
    {
        public static IWebJobsBuilder AddNatsExtension(this IWebJobsBuilder builder)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }
            builder.AddExtension<OutlookExtensionConfigProvider>();
            builder.Services.AddSingleton<IOutlookServiceFactory, OutlookServiceFactory>();
            return builder;
        }
    }

اکنون می‌توانیم یک ویژگی لاجوردی را ذخیره کنیم که می‌تواند بر اساس ایمیلی که در جعبه ایمیل دریافت می‌کنید فعال شود:

public static class OutlookTriggerFunction
    {
        [FunctionName("OutlookTriggerFunction")]
        public static void Run(
            [OutlookTrigger(GraphConnectionString = "mail.outlook.com", EmailId = "myemail@outlook.com", Password = "Password")] string outlookMessage,
            ILogger log)
        {
            log.LogInformation($"Message Received From outlook mailbox is {outlookMessage}");
        }
    }

نتیجه

امیدوارم این وبلاگ به شما کمک کرده باشد تا در مورد محرک های V2 و V3 برای ویژگی های Azure بیاموزید. مجدداً، اگر شما نیز می‌خواهید یک وبلاگ V1 داشته باشید، لطفاً آن را در نظرات زیر ذکر کنید. همچنین، اگر شک دیگری دارید، لطفاً در زیر نظر دهید و مهندسان DEV IT ما با شما تماس خواهند گرفت.

نشریه قسمت -2: راهنمای تخصصی برای آموزش عملکرد Azure اولین بار در مجله DEV IT ظاهر شد.

نحوه ایجاد رویدادهای تجاری با Azure Logic Apps


معرفی

اگر مشتاقانه منتظر ایجاد یک گردش کار خودکار برای ادغام خدمات خود هستید، پس نرم افزار Azure Logic راه خواهد بود. این وبلاگ به روند توسعه چنین برنامه ای می پردازد و به شما کمک می کند تا در کوتاه ترین زمان شروع کنید.

انواع رویدادهای تجاری

رویدادهای تجاری داخلی

با استفاده از این مراحل را دنبال کنید ارتباط برای پیکربندی و تأیید هشدارها برای رویداد تجاری جاسازی شده

سفارشی کردن رویدادهای تجاری

یک پروژه برای رویدادهای تجاری شخصی ایجاد کنید

مراحل را دنبال کنید ارتباط برای ایجاد یک رویداد تجاری سفارشی برای ایجاد یک ارائه دهنده

  • ابتدا یک پروژه جدید Dynamics به نام “Dev_BusinessEvents” ایجاد کنید.
  • سپس مدل Application Foundation با عنوان “ApplicationSuite” را به روز کنید.
  • در نهایت یک کلاس جدید به نام DevVendorCreatedBusinessEventContract اضافه کنید
/// <summary>
/// The data contract for the <c>VendorCreatedBusinessEvent</c>,business events.
/// </summary>
[DataContract]
public  class DevVendorCreatedBusinessEventContract extends BusinessEventsContract
{
    private VendAccount vendAccount;
    /// <summary>
    /// Initializes the field values.
    /// </summary>
    private void initialize(VendTable _vendTable)
    {
        vendAccount = _vendTable.AccountNum;
    }

    /// <summary>
    /// Creates a <c>VendorCreatedBusinessEventContract</c> from a <c>VendTable</c> record.
    /// </summary>
    /// <param name = "_VendTable">A <c>VendTable</c> record.</param>
    /// <returns>A <c>VendorCreatedBusinessEventContract</c>.</returns>
    public static DevVendorCreatedBusinessEventContract newFromVendTable(VendTable _vendTable)
    {
        var contract =  DevVendorCreatedBusinessEventContract::construct();
        contract.initialize(_vendTable);
        contract.parmVendAccount(_vendTable.AccountNum);
        return contract;
    }

    [DataMember('AccountNumber'), BusinessEventsDataMember("@Dev:AccountNumber")]
    public VendAccount parmVendAccount(VendAccount _vendAccount = vendAccount)
    {
        vendAccount = _vendAccount;
        return vendAccount;
    }

    private void new()
    {
    }

    public static DevVendorCreatedBusinessEventContract construct()
    {
        DevVendorCreatedBusinessEventContract retVal = new DevVendorCreatedBusinessEventContract();
        return retVal;
    }

}
  • یک کلاس جدید به نام “DevVendorCreatedBusinessEvent” اضافه کنید
[BusinessEvents(classStr(DevVendorCreatedBusinessEventContract),
"Dev:VendorCreatedEvent","Dev:VendorCreatedEventDescription",ModuleAxapta::Vendor)]
public final class DevVendorCreatedBusinessEvent extends BusinessEventsBase
{
    private VendTable vendTable;
         private VendTable parmVendTable(VendTable _vendTable = vendTable)
    {
        vendTable = _vendTable;
        return vendTable;
    }

    private void new()
    {
        super();
    }

    public static DevVendorCreatedBusinessEvent construct()
    {
        DevVendorCreatedBusinessEvent retVal = new DevVendorCreatedBusinessEvent();
        return retVal;
    }

    [Wrappable(true), Replaceable(true)]
    public BusinessEventsContract buildContract()
    {
        return DevVendorCreatedBusinessEventContract::newFromVendTable(vendTable);
    }

    static public DevVendorCreatedBusinessEvent newFromVendTable(VendTable _vendTable)
    {
        DevVendorCreatedBusinessEvent businessEvent =  DevVendorCreatedBusinessEvent::construct();
        businessEvent.parmVendTable(_vendTable);
        return businessEvent;
    }

}
  • ماشه “VendTable_onInserted” خود را ایجاد کنید. اکنون یک کلاس جدید ایجاد کنید، همانطور که در زیر برای رویدادهای تجاری که به عنوان “Seller Create” برگزار می شود، ایجاد کنید.
public static class DevVendorCreatedBusinessEventTrigger_Extension
{
     
    /// <summary>
    ///Send the business event on vendor record creation.
    /// </summary>
    /// <param name="sender">Vendor Table</param>
    /// <param name="e"></param>
    [DataEventHandler(tableStr(VendTable), DataEventType::Inserted)]
    public static void VendTable_onInserted(Common sender, DataEventArgs e)
    {
       
        VendTable vendTable = sender;
        DevVendorCreatedBusinessEvent businessEvent = DevVendorCreatedBusinessEvent::newFromVendTable(vendTable);
        if(businessEvent)
        {
            businessEvent.send();
        }
    }

}

در نهایت، اکنون می توانید پروژه را بسازید

یک رویداد تجاری سفارشی را فعال کنید

برای ایجاد یک رویداد تجاری سفارشی، لطفاً مراحل زیر را دنبال کنید:

مدیریت سیستم >> راه اندازی >> رویدادهای تجاری >> کاتالوگ رویدادهای تجاری >> مدیریت >> بازیابی کاتالوگ رویدادهای تجاری

رویداد تجاری سفارشی ایجاد شده به لیست رویدادهای تجاری همانطور که در صفحه زیر نشان داده شده است اضافه می شود:

یک برنامه منطقی در پورتال Azure ایجاد کنید

در نهایت، زمان تولید برنامه منطقی است. ابتدا در https://portal.azure.com وارد شوید

برای ایجاد یک برنامه منطقی «VendorCreatedLogicApp»، همان مراحل را در پیوند رویداد تجاری تعبیه شده دنبال کنید.

طراحی برنامه منطقی شما مانند صفحه زیر خواهد بود:

یک ارائه دهنده جدید در D365 FO ایجاد کنید و بررسی کنید که آیا ایمیل های هشدار دریافت می کنید و باید آماده باشید.

نتیجه

با انجام مراحل بالا، همانطور که گفته شد، باید برنامه Azure Logic خود را آماده داشته باشید. مهندسان DEV IT ما این آموزش را پس از دریافت چندین درخواست برای آن در نظرات وبلاگ های قبلی آماده کرده اند. اگر در مورد موضوع دیگری به کمک نیاز دارید، لطفاً در نظرات زیر دریغ نکنید و ما مطمئناً به شما کمک خواهیم کرد.

نشریه نحوه ایجاد رویدادهای تجاری با برنامه های منطقی Azure برای اولین بار در مجله DEV IT ظاهر شد.

نحوه پیاده سازی نرم افزار موثر از طریق BigFix


BigFix برای مدیریت نقاط پایانی عالی است و بیش از 100 میلیون نقطه پایانی در سراسر جهان دارد. اگر سازمان شما زیرساخت بزرگی دارد و به ابزارهایی برای کارآمدتر کردن مدیریت دستگاه برای پول و زمان نیاز دارد، BigFix یک توصیه عالی برای شما است. همچنین به شما امکان می دهد بررسی کنید که آیا بسته بر اساس منطق قدرت ارتباط نصب شده است یا خیر.

این وبلاگ به پیاده سازی Datadog با BigFix می پردازد و به شما این امکان را می دهد که فرآیندهای پیاده سازی خود را خودکار کنید تا از حداکثر کارایی در سازمان خود اطمینان حاصل کنید.

نحوه پیاده سازی Datadog از طریق BigFix

داگ داده یک سرویس نظارت بر داده‌ها است که برای برنامه‌های ابری بزرگ کار می‌کند و نظارت بر سرورها، پایگاه‌های داده، ابزارها و خدمات را از طریق پلت فرم داده مبتنی بر SAAS به توسعه‌دهندگان ارائه می‌دهد.

پیاده سازی مورد بحث در این وبلاگ ممکن است کمی پیچیده به نظر برسد، زیرا ما در حال حاضر چندین سرور با تنظیمات Datadog و YAML داریم. این کار به این دلیل انجام شد که ما آنها را از طریق BigFix روی این سرورها پیاده سازی نکنیم. علاوه بر این، ما مجموعه دیگری از سرورها را در DEV IT داشتیم که باید از طرح ایمپلنت حذف می شدند.

تصمیم بر این شد که کاشت در 3 قسمت انجام شود که در زیر نشان داده شده است:

  1. Datadog Agent را روی همه سرورهایی که وجود ندارد نصب کنید
  2. فایل پیکربندی YAML را طوری نصب کنید که فقط روی سرورهایی نصب شود که قبلاً وجود نداشت.
  3. یک طرح اتوماسیون برای همه سرورهایی که ممکن است در آینده ظاهر شوند ایجاد کنید

نصب یک عامل

برای نصب عامل مجبور شدیم سه فیکسلت نصب (ویندوز، لینوکس، اوبونتو) ایجاد کنیم. تناسب آنها به گونه ای تنظیم شد که تمام سرورهایی را که بخشی از گروهی هستند که مشتری نمی خواست Datadog داشته باشد را حذف می کند. ما همچنین مجبور شدیم سرورهایی را با عوامل از پیش نصب شده خاموش کنیم. بنابراین، اگر به صورت دستی انجام شود، کاری که می تواند خسته کننده باشد، فقط چند عبارت مناسب از طریق BigFix است.

  • یک گروه خودکار ایجاد شده است که می تواند همه سرورهای گروه هایی را که نیازی به استقرار با Datadog ندارند ترکیب کند. مزیت ایجاد یک گروه خودکار این بود که هر بار که سرور جدیدی در BigFix ظاهر می شد که در آن گروه بود، به طور خودکار به آن گروه خودکار اضافه می شد. ما همچنین می توانیم در صورت درخواست مشتری، بندهای استثنای بیشتری اضافه کنیم. بند مربوط به فیکسلت ما اضافه شده است تا همه سرورهایی که بخشی از این گروه هستند حذف شوند.
  • برای مقابله با سرورهایی که Datadog Agent از قبل نصب شده‌اند، عباراتی را ایجاد کرده‌ایم که می‌توانند سرویس عامل Datadog را بررسی کنند. در اینجا ما یک پیچیدگی دیگر داشتیم که در آن باید تنظیمات YAML را در صورت عدم وجود روی همه این سرورها نصب کنیم. این در قسمت دوم ایمپلنت مورد بحث قرار گرفت.
  • پس از برقراری ارتباط، تنها سرورهایی که این بندهای مربوط به اعتبار را داشتند مورد هدف قرار گرفتند، بنابراین تمام تلاش دستی ما کاهش یافت.

یک پیکربندی YAML را مستقر کنید

برای اجرای YAML، این طرح باید طوری طراحی می شد که فقط سرورهایی را شامل شود که YAML از پیش نصب نشده باشند. این معیارها شامل همه سرورها می شود، چه عامل Datadog از قبل نصب شده باشد یا نه. اما در اینجا ما یک مشکل داشتیم که فایل YAML باید هر 2-3 ماه یکبار به روز می شد و ما مجبور بودیم یک شمارنده سرور برای اینکه آنها در حال حاضر چه نسخه ای از فایل را دارند نگهداری کنیم. علاوه بر این، ما مجبور شدیم روشی برای فیلتر کردن سرورهایی ایجاد کنیم که YAML از قبل وجود دارد. این کار با روش های ذکر شده در زیر انجام شد.

  • ما ابتدا یک ویژگی سفارشی ایجاد کردیم که مکان سیستم عامل خاصی را بررسی می کند و اگر فایل پیکربندی YAML خاصی در آن مکان وجود داشته باشد، بله را برمی گرداند.
  • سپس از این ویژگی در رفع فیلتر سرورهایی که YAML از قبل نصب شده بودند استفاده شد
  • در تمام سرورهایی که اکنون در محدوده ما قرار دارند، فایلی را مستقر کرده ایم که نسخه فایل YAML را که با موفقیت روی آن سرور نصب شده است، ضبط می کند. سپس این نسخه با استفاده از Analysis بر روی کنسول خوانده شد که گزارش دهی را بسیار آسان تر کرد. این همچنین به ما کمک کرد تا موارد آسیب را بسیار ساده تر ردیابی کنیم، که اگر به صورت دستی انجام شود آزاردهنده خواهد بود.
  • هنگامی که فیکسلت آماده شد، هر زمان که یک پیکربندی جدید توسط مشتری درخواست شود، می توان آن را به روز کرد و ما فقط باید فایل متنی حاوی نسخه ذخیره شده در آن را به روز کنیم.

پیاده سازی بیشتر را خودکار کنید

پس از تکمیل استقرار عامل و فشار پیکربندی YAML در تمام سرورها، روشی ایجاد کردیم که می‌توانست فایل‌های عامل و پیکربندی را به طور خودکار روی سرورهای جدید نصب کند. به همین دلیل است که ما یک خط پایه ایجاد کردیم که تمام این اصلاحات را نصب کرده است. سپس یک اقدام خط مشی ایجاد کردیم که خطوط پایه را بر اساس سیستم عامل سرور فشار می داد. به این ترتیب تمامی سرورهای جدید به درخواست مشتری تحت مانیتورینگ Datadog اضافه شدند.

نتیجه

با دنبال کردن این وبلاگ، می توانید برنامه خود را برای پیاده سازی نرم افزار خود از طریق BigFix ایجاد کنید. این کار فرآیندهای شما را در آینده هموار می کند و در زمان توسعه نرم افزار در زمان شما صرفه جویی می کند. اگر در مورد موضوع شک دارید، لطفاً در نظرات با ما تماس بگیرید و ما با شما تماس خواهیم گرفت.

نشریه نحوه پیاده سازی نرم افزار موثر با BigFix برای اولین بار در مجله DEV IT ظاهر شد.

نحوه توسعه اپلیکیشن Dockerize با Angular و Node JS


توسعه برنامه Dockerize شما با Angular JS و Node JS بسیار ساده تر است. با این حال، قبل از اینکه یاد بگیرید چگونه آن را توسعه دهید، ایده خوبی است که یاد بگیرید Docker چیست.

داکر چیست؟

Docker یک پلتفرم یکپارچه است که به توسعه دهندگان اجازه می دهد برنامه های بزرگ و کوچک را در حال حرکت ایجاد، اجرا و اجرا کنند. با Docker، می‌توانید برنامه‌ها را در هر زمان و هر مکان کانتینری کنید.

داکر از یک رویکرد مبتنی بر کانتینر استفاده می‌کند، با هر کانتینر به توسعه‌دهنده این امکان را می‌دهد تا برنامه‌ای را با تمام بخش‌های لازم، مانند کتابخانه‌ها و دیگر وابستگی‌ها، بسته‌بندی کند و آن را به‌صورت یک بسته ارسال کند.

معماری پایه داکر

مزایای استفاده از Docker؟

در اینجا برخی از مزایای استفاده از Docker در طول فرآیند توسعه آورده شده است:

  • اجرای سریع
  • قابل حمل بودن
  • کنترل نسخه
  • عایق
  • امنیت

مفروضات

چندین پیش نیاز برای توسعه برنامه شما با Docker وجود دارد. اول، فرض می کنیم که خواننده دانش اولیه توسعه با AngularJS و Node JS را دارد. علاوه بر این، موارد زیر باید بر روی سیستم کامپیوتر شما تنظیم شود:

  1. Node (https://nodejs.org/en/download/)
  2. زاویه ای
  3. داکر (https://docs.docker.com/engine/install/)
  4. سیستم عامل: ویندوز
  5. نمونه اپلیکیشن Angular JS و Node JS را می توانید از لینک زیر دانلود کنید: https://github.com/bbachi/angular-nodejs-example.git

در این وبلاگ، روند مورد نیاز برای استقرار برنامه کامل mid-stack را با مثال های زنده توضیح خواهیم داد.

به نکات زیر خواهیم پرداخت:

  1. معرفی.
  2. اتصال برنامه نمونه از یک ماشین محلی.
  3. برنامه های docker را اجرا کرده و به آنها دسترسی پیدا کنید.
  4. نتیجه

1 معرفی

  • می‌توانید با Dockerize شروع کنید و تصویر Docker را با استفاده از موتورهای ارکستراسیون کانتینر مانند Docker یا Kubernetes اجرا کنید. ما در مثال خود به برنامه Dockerize می کنیم و یک تصویر ایجاد می کنیم و آن را روی Docker در ماشین محلی خود اجرا می کنیم. همچنین می‌توانیم روی این تصویر در مرکز داکر کلیک کنیم و آن را در زمان و جایی که به آن نیاز داریم بکشیم.
  • ایجاد یک تصویر Docker: پس از نصب برنامه نمونه، باید یک تصویر داکر ایجاد کنید. دستورات مربوط به همان دنبال می شوند
// create an image
docker build -t angular-node-image.
// running on Image
docker run -it -p 3080:3080 --name ang-node-ui angular-node-image

2. برنامه Dockerize از ماشین محلی

  • FROM: از تصویر رسمی یک گره به عنوان تصویر اصلی استفاده کنید
  • WORKDIR: دایرکتوری کاری را تنظیم کنید
  • RUN: از دستور RUN برای نصب یا اجرا استفاده کنید
  • کپی: پوشه ها/فایل را در منبع تا مقصد کپی کنید.
  • EXPOSE: پورت تعریف شده است
// build the image
docker build -t angular-node-image .// check the images
docker images

دستورات اضافی

  • برای ساختن تصویر داکر زاویه ای دستور زیر را اجرا کنید.
docker build -t angular
  1. دستور زیر را برای ساختن تصویر تنظیم گره اجرا کنید.
docker build -t node
#Run Angular Docker image
docker run -d -it -p 4200:4200/tcp --name angular
#Run Node Docker image
docker run -d -it -p 3000:3000/tcp --name node

فایل پیکربندی Angular Docker

فایل پیکربندی Node JS

3. یک برنامه را در Docker اجرا کنید و به آن دسترسی پیدا کنید

هنگامی که تصویر را با موفقیت ساختیم، زمان اجرای هر دو برنامه (Angular و Node JS) با استفاده از تصویر داکر فرا می رسد. پورت مشترک را تنظیم و آشکار کردیم: 3080.

docker run -d -p  3080:3080 --name ang-node-ui angular-node-image
docker ps

به برنامه docker دسترسی پیدا کنید
http://localhost: 3080.

خلاصه کردن

در این وبلاگ، نحوه توسعه، راه‌اندازی و استقرار برنامه‌ها را به روش docker کارآمد مورد بحث قرار دادیم. این معماری مقیاس پذیر مطمئناً به توسعه و راه اندازی برنامه های کاربردی آینده نگر در سطح بالا در حال حرکت کمک می کند. با این حال، اگر هنوز در این مورد نظر دارید یا سؤالی از کارشناسان DEV IT ما دارید، از تماس با ما یا ارسال نظر در زیر دریغ نکنید.

نشریه How to develop a Dockerize application with Angular and Node JS اولین بار در مجله DEV IT ظاهر شد.

راهنمای مبتدیان برای امتحان مجدد مدل انحراف نمایی


گنجاندن Retry Pattern در فضای توسعه به دلیل خرابی های گذرا است که بیشتر در محیط توسعه ابری. خرابی های گذرا در طول توسعه زمانی رخ می دهد که یک مورد با یک جزء خارجی ارتباط برقرار می کند، اما آن جزء یا سرویس خارجی در دسترس نیست.

اما مشکل موقتی است و وقتی دوباره با سرویس یا کامپوننت تماس گرفتیم وصل می شود. به این محدودیت های موقت، خرابی های گذرا می گویند و در محیط ابری احتمال این خرابی ها افزایش یافته است.

از آنجایی که سیستم رایانش ابری در طیف کاملی از اجزا و برنامه های مختلف توزیع شده است، مشکلات میزبانی وجود دارد. برخی از از دست دادن لحظه ای شبکه یا کمبود سرویس بیشتر به مشکلات کمک می کند. استقرار RetryPattern راه حلی برای دور زدن این مسائل است.

اما پس چرا از امتیاز نمایی استفاده می کنیم؟

ایده پشت استفاده از لغو نمایی با تلاش مجدد این است که به جای تلاش مجدد پس از انتظار برای یک دوره زمانی ثابت، تأخیر بین تلاش های مجدد را پس از هر تلاش ناموفق افزایش دهیم.

به عنوان مثال، زمانی که از SFTP برای انتقال و کپی فایل ها استفاده می کنیم، انجام کار به زمان نیاز دارد. می توانیم از این زمان برای اجرای تابع ExponentialBackoff استفاده کنیم.

برای استفاده از تاخیر نمایی، می توانیم از کتابخانه منبع باز (Polly) استفاده کنیم. کتابخانه Polly از Framework 4.0 به بعد پشتیبانی می کند و همچنین با .NET Core سازگار است.

برای استفاده از Polly باید بسته Polly را از بسته NuGet در ویژوال استودیو نصب کنیم.

در اینجا ما فقط این مفهوم را به اشتراک می گذاریم که چگونه می توانیم از کتابخانه Polly برای بررسی اینکه آیا یک فایل در جاده موجود است یا نه استفاده کنیم.

برای انجام این کار، ما تابعی ایجاد می کنیم تا بررسی کنیم که آیا فایل به روش خاصی در دسترس است یا خیر.

public static bool IsAvailableFile(string filePath) 

        { 

            Policy retryPolicy = Policy.Handle<IOException>().WaitAndRetry(6, i => TimeSpan.FromSeconds(Math.Pow(2, i))); 

            retryPolicy.Execute(() => 

            { 

                using (FileStream stream = File.OpenRead(filePath)) 

                { 

                    stream.Close(); 

                } 

            }); 

            return true;   }

در کد بالا می بینیم که مسیر فایل را به تابع منتقل کرده ایم و بررسی می کند که آیا فایل به طور کامل ذخیره شده است یا خیر. اگر نه، زمان معینی منتظر می ماند، دوباره امتحان کنید و دوباره وضعیت فایل را بررسی کنید.

بر این اساس، مقدار واقعی فایلی که با موفقیت ذخیره شده است را برمی گرداند. اکنون می توانیم از این فایل برای پردازش بیشتر استفاده کنیم. کد بالا را می توان در هر جایی با توجه به نیاز ما استفاده کرد.

علاوه بر بررسی اینکه آیا فایل ذخیره شده است یا نه، می توانیم از کتابخانه Polly برای موارد دیگر استفاده کنیم. این شامل؛

  • دوباره امتحان کن
  • تعویض
  • زمان انتظار
  • عایق مانع
  • تخفیف به روشی روان و بدون نخ

اسکریپت کد زیر نشان می دهد که چگونه می توانیم از HTTP Retires ادغام شده با Polly در lHTTPClientFactory استفاده کنیم.

lHttpClientFactory پس از Dot Net Core 2.1 در دسترس است. به همین دلیل توصیه می شود از آخرین بسته های Net 5 NuGet استفاده کنید.

یک مشتری تکراری Polly را پیکربندی کنید startup.cs

//ConfigureServices()  - Startup.cs

services.AddHttpClient<IBasketService, BasketService>()

.SetHandlerLifetime(TimeSpan.FromMinutes(5))  //Set lifetime to five minutes

.AddPolicyHandler(GetRetryPolicy());

برای داشتن یک رویکرد ماژولارتر به خط مشی HTTP Retry مجدد، می توانید از روش استقرار دیگری پیروی کنید که در زیر آورده شده است.

static IAsyncPolicy<HttpResponseMessage>GetRetryPolicy()
{
    return HttpPolicyExtensions
.HandleTransientHttpError()
.OrResult(msg =>msg.StatusCode == System.Net.HttpStatusCode.NotFound)
.WaitAndRetryAsync(6, retryAttempt =>TimeSpan.FromSeconds(Math.Pow(2,
retryAttempt)));
}

با استفاده از Polly، می‌توانیم یک خط‌مشی تلاش مجدد را با n تلاش مجدد تعریف کنیم، و در صورت وجود یک استثنا HTTP، مانند ثبت خطا، اقداماتی را می‌توان انجام داد.

در مورد بالا، این خط‌مشی به گونه‌ای پیکربندی شده است که شش بار با تلاش مجدد نمایی شروع شود، که با دو ثانیه شروع می‌شود.

خط مشی امتحان مجدد می تواند سیستم ما را در صورت موازی بودن و مقیاس پذیری بالا تحت تأثیر قرار دهد. برای غلبه بر اوج چنین تلاش های مجددی که از سوی بسیاری از مشتریان با یک وقفه جزئی انجام می شود، می توانیم اضافه کنیم استراتژی نوسان به الگوریتم / خط مشی سعی مجدد.

این کار باعث بهبود عملکرد سیستم از انتها به انتها می شود. برای بررسی کد به نمونه زیر مراجعه کنید استراتژی نوسان.

var delay = Backoff.DecorrelatedJitterBackoffV2(medianFirstRetryDelay: TimeSpan.FromSeconds(1), retryCount: 5);
 var retryPolicy = Policy
.Handle<FooException>()
.WaitAndRetryAsync(delay);

تعویض

برای کنترل عیوب گذرا درازمدت، یک قطع کننده مدار اضافه شده است. می‌توانیم یک بریکر به کد اضافه کنیم تا سرویس را بپیچانیم و مدار را باز علامت‌گذاری کنیم تا نشان دهیم که سرویس یا قطعه در دسترس نیست یا حتی پس از چندین بار تلاش پاسخ نمی‌دهد.

اگر مشکلی پیش بیاید، دائماً دکمه را فشار می دهیم که از تلاش بیشتر برای تکرار عملیات جلوگیری می کند.

این معمولاً زمانی استفاده می شود که اعتیاد بسیار غیرقابل اعتمادی داشته باشیم. در این مورد، ما می خواهیم به طور کامل فراخوانی آن را متوقف کنیم، زیرا تلاش های اضافی برای فراخوانی ممکن است وضعیت را بدتر کند. یک مثال از این می تواند یک پایگاه داده متراکم باشد.

امضا:

Policy
.Handle<Exception>()
.CircuitBreakerAsync(
	int exceptionsAllowedBeforeBreaking,
TimeSpandurationOfBreak,
	Action<Exception, TimeSpan>onBreak,
	Action onReset);

دستکاری کننده: مانند قوانین امتحان مجدد. این نوع استثناهایی را که این خط‌مشی می‌تواند مدیریت کند، تعیین می‌کند.

CircuitBreakerAsync (():

استثناهای int قبل از خراب شدن مجاز هستند نشان می دهد که چند استثنا در یک ردیف باعث راه اندازی یک قطع کننده مدار می شود.

TimeSpandurationOfBreak تعیین می کند که چه مدت مدار شکسته باقی می ماند.

عملدر استراحت نماینده ای است که به شما امکان می دهد یک عمل (معمولاً برای ثبت نام استفاده می شود) را هنگام شکستن زنجیره انجام دهید.

عمل بازنشانی نماینده ای است که به شما امکان می دهد هنگام تنظیم مجدد مدار، عملی را انجام دهید (دوباره معمولاً برای ثبت نام).

در مثال خود، یک خط مشی قطع کننده مدار ایجاد کردیم که پس از 1 شکست روشن می شود.

اگرچه مثال بالا برای نمایش است، می‌توانید این مقدار را در یک سناریوی واقعی با توجه به الزامات و سرویسی که می‌خواهید تماس بگیرید، تغییر دهید.

public async Task<string>GetGoodbyeMessage()
{
  try
  {
Console.WriteLine($"Circuit State: {_circuitBreakerPolicy.CircuitState}");
	return await _circuitBreakerPolicy.ExecuteAsync<string>(async () =>
	{
    	return await _messageRepository.GetGoodbyeMessage();
	});
  }
  catch (Exception ex)
  {
	return ex.Message;
  }
}

این به این دلیل است که وقتی خط مشی شکن خاموش است، هر تلاش دیگری برای انجام این عمل به طور خودکار انجام می شود استثنا برای BrokenCircuitException.

به جای مدیریت صحیح خطا، ما به سادگی پیام خطا را به عنوان مقدار بازگشتی ارسال می کنیم – باز هم، این فقط برای اهداف نمایشی است، بنابراین می توانیم ببینیم که خطا چگونه به نظر می رسد. در ابتدا متوجه خواهید شد که اشتباه به این صورت است.

اما زمانی که برای اولین بار یک استثنا رخ می دهد که باعث ایجاد خط مشی قطع کننده مدار می شود، مقدار را به صورت باز می گرداند.

تمام تلاش‌های بعدی برای تماس با سرویس با شکست مواجه می‌شوند استثنا برای BrokenCircuitException توسط سیاست برای قطع کننده مدار پرتاب می شود.

نتیجه

RetryPattern، Backoff Exponential و Circuit Breaker ابزارهای عالی در این دنیای مدرن توسعه هستند. استفاده از آنها در یک محیط توسعه که توسط محاسبات ابری، میکروسرویس ها و معماری بدون سرور هدایت می شود، افزایش خواهد یافت.

اگرچه این مولفه های توسعه مهم هستند، اما باید از آنها عاقلانه استفاده کرد. استفاده از آنها به محیط توسعه، الزامات برنامه و رفتار خدمات بستگی دارد. بنابراین، قبل از استفاده از هر یک از این اجزا، حتما این جنبه ها را در نظر بگیرید.

در حالی که در مورد تمرین های توسعه آینده محور صحبت می کنیم، ما در DEV IT درک تأثیر و اهمیت توسعه بر تجارت. وقتی می خواهید راه حل آماده ای برای آینده بسازید، دیگر به دنبال آن نباشید. نیازهای خود را به ما اطلاع دهید و ما به شما در ایجاد راه حل مناسب کمک خواهیم کرد.

نشریه A Beginner’s Guide to Re-Trying to Implementation An Exponential Deviation Model برای اولین بار در مجله DEV IT ظاهر شد.

4 مرحله آسان برای میزبانی یک برنامه وب اصلی ASP.NET در سرویس ویندوز


آیا می دانستید که ما می توانیم یک سرویس ویندوز ASP.NET را با سرویس ویندوز بدون استفاده از IIS میزبانی کنیم؟ مزیت هاست در سرویس ویندوز این است که پس از راه اندازی مجدد سرور، برنامه به طور خودکار راه اندازی مجدد می شود.

این قابلیت با کمک Worker Service Template پیاده سازی شده است که به نقطه شروعی برای نوشتن و ساخت اپلیکیشن های خدمات طولانی مدت تبدیل می شود. ما روی راه حلی بدون IIS تمرکز می کنیم، زیرا ممکن است همیشه در دسترس نباشد.

حتی در شرایطی که قبلاً IIS را راه‌اندازی کرده‌اید، ممکن است برنامه‌های NET Core را میزبانی نکند، چه رسد به ASP.NET Core. بنابراین، برای میزبانی آنها، باید پیاده سازی برنامه وب .NET Core را در ویژوال استودیو درک کنید.

چرا از یک برنامه وب به عنوان یک سرویس ویندوز استفاده کنیم؟

در شرایطی که می‌خواهید برنامه‌های NET Core را بدون IIS میزبانی کنید، می‌توانیم با خود استقرار کار کنیم. در اینجا برنامه اساساً به عنوان یک فایل exe کار می کند.

برای راه اندازی یک محیط میزبانی ASP.NET 3.1 در سرویس ویندوز این مراحل را دنبال کنید.

1. یک برنامه ASP.NET Core 3.1 جدید در ویژوال استودیو ایجاد کنید

یک پروژه جدید در برنامه وب VS2019 .NetCore ایجاد کنید. هنگام ایجاد یک پروژه جدید در پوشه، نسخه 3.1 را مشخص کنید (عکس از صفحه را دنبال کنید).

2. برنامه ASP.Net Core را به عنوان یک سرویس ویندوز راه اندازی کنید

بعد از مرحله اول، زمان اجرای برنامه را مشخص کنید. ASP.NET Core از سیستم عامل هایی که سرویس های ویندوز در آنها اجرا نمی شوند نیز پشتیبانی می کند.

برای این کار باید فایل پروژه را تغییر دهیم. برای تغییر فایل پروژه، روی نام پروژه دوبار کلیک کنید و مطابق تصویر دو خط زیر را اضافه کنید.

با استفاده از بسته NuGet پیوند اضافه کنید Microsoft.ASPNetCore.Hosting.WindowsServices و Newtonsoft.json.

این پکیج همه چیزهایی را که برای اجرای برنامه ASP.Net Core به عنوان یک سرویس پنجره نیاز دارید، دارد.

اکنون برنامه را به عنوان یک سرویس ویندوز اجرا کنید و آن را در فایل Program.cs پیکربندی کنید. اگر می خواهید برنامه ای مانند IIS Express را اجرا کنید، نیازی به تغییر تنظیمات پیکربندی نیست و می توانیم برنامه ای مانند IIS Express را مستقیماً اجرا کنیم.

می توانیم پورت دیگری را در آن مشخص کنیم appsettings.json و appsettings.Devlopment.json فایل را برای اجرای مستقیم برنامه روی آن پورت با استفاده از سرویس ویندوز.

پورت № 5009 را مشخص کنید.

فایل appsettings.json:

{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
	}
  },
"AllowedHosts": "*",
"ServicePort" :  5009
}
 appsettings.Devlopment.json file:
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
	}
  },
"ServicePort": 5009

ما همچنان به شفاف سازی خودمان ادامه می دهیم appsettings.json فایل به عنوان مسیر پیکربندی در Program.cs فایلی که به برنامه اجازه می دهد این مسیر را بخواند و روی این پورت کار کند. اسکرین شات های زیر را ببینید.

Program.csFile:

3. برنامه را ایجاد کنید و کد را منتشر کنید

با پیکربندی فوق تکمیل شده در Program.cs فایل شروع به ساخت برنامه می کند و سپس کد را در پوشه منتشر می کند.

4. برنامه را به عنوان WindowsService اجرا کنید

برای اجرای برنامه به عنوان یک سرویس ویندوز، مراحل زیر را دنبال کنید.

  • یک خط فرمان با اجازه مدیر باز کنید.
  • با استفاده از این دستور برنامه را به عنوان یک سرویس ویندوز ثبت کنید (فضای بعد از “binPath =” مورد نیاز است)

با استفاده از دستور زیر یک سرویس ویندوز ایجاد کنید:

sc create AspNetCoreWindowsServicebinPath = “مسیر برنامه من برای انتشار پوشه exe – سرویس”

در مثال بالا که گرفتیم AspNetCoreWindowsService به عنوان یک نام؛ شما می توانید از هر نامی که می خواهید نگه دارید استفاده کنید. همچنین، -سرویس نام استدلالی است که ما می گذرانیم Program.cs فایل.

لانه، باز کن services.msc و سرویس ویندوز میزبان خود را با نام مشاهده کنید AspNetCoreWindowsService برای شروع سرویس

وقتی سرویس شروع شد، مرورگر را باز کنید و به آن بروید http://localhost: 50009برای مشاهده اینکه برنامه وب در حال اجرا است. اگر به خاطر داشته باشید، ما پورت 5009 را در مراحل اولیه توسعه برنامه های وب اصلی ASP.NET تنظیم کرده بودیم. به طور خاص، به دنبال بخشی باشید که در آن به آن اشاره کردیم appsetting.json مانند بالا فایل کنید

با استفاده از دستور زیر سرویس ویندوز را حذف کنید:

قبل از راه اندازی نسخه جدید سرویس، نمونه در حال اجرا موجود را متوقف کنید. وقتی کارتان تمام شد، دستور زیر را بنویسید.

scdeleteAspNetCoreWindowsService

از نو، AspNetCoreWindowsService ونام سرویس ویندوز است که برای مثال برای شما مشخص کردیم.

برای خلاصه کردنش

این وبلاگ شما را طی مراحل راه اندازی یک محیط میزبانی برای توسعه برنامه وب ASP.NET Core 3.1 در سرویس ویندوز. اگرچه این فرآیند به اندازه کافی ساده است برای درک، ما در DEV IT تفاوت های ظریف را درک کرده اند و همه چیز را در مورد آن می دانند شیوه های توسعه انعطاف پذیر.

تجربه توسعه ما به ما این امکان را داده است که برنامه هایی ایجاد کنیم که بهترین عملکرد را در کلاس خود نشان می دهند و به شما کمک می کنند تا کسب و کار خود را به سطح بعدی ببرید. برای هر نوع خدمات توسعه اپلیکیشن موبایل با ما تماس بگیرید.

نشریه 4 مرحله آسان برای میزبانی یک برنامه وب اصلی ASP.NET در سرویس پنجره برای اولین بار در مجله DEV IT ظاهر شد.

راهنمای تخصصی برای ادغام D365 F&O و Dataverse با استفاده از کانکتور نوشتن دوگانه


Dual-Write یک ابزار یکپارچه سازی است و بخشی از بسته توسعه مالی و عملیاتی Dynamics 365 است. این ابزار تعامل بلادرنگ بین تعامل مشتری و برنامه های کاربردی عملیاتی را فراهم می کند. این وبلاگ به عنوان یک راهنمای عمیق در مورد نحوه همگام سازی مشتریان حساب D365 Finance & Dataverse با Dual-write خدمت می کند.

سیستم مورد نیاز و پیش نیازها:

در اینجا برخی از پیش نیازهای این فرآیند وجود دارد:

1 به روز رسانی پلتفرم و نسخه برنامه را بررسی کنید.

باید مطمئن شوید که محیط برنامه Finance & Operations شما با به‌روزرسانی پلتفرم 33 و نسخه برنامه 10.0.9 یا بالاتر کار می‌کند.

2. هسته نوشتن دوگانه را نصب کنید.

هسته نوشتن دوگانه حاوی متادیتا برای نقشه های جدول شماست و باید در محیط های شما نصب شود.

3. باید به Dataverse دسترسی داشته باشید تا به آن اجازه دهید به برنامه Finance & Operations متصل شود.

4. همچنین به برنامه Finance & Operations دسترسی بدهید تا به Dataverse متصل شود.

5. سپس با درخواست در مستاجر موافقت کنید. اگر از هسته نوشتن دوگانه نسخه 1.0.16.0 یا جدیدتر استفاده می کنید، این مرحله را می توان نادیده گرفت.

6. مطمئن شوید که افزونه های نوشتن دوگانه فعال هستند.

7. راه حل نقشه راه حل ارکستراسیون برنامه ضبط دوگانه را نصب کنید.

8. راه حل Prospect to Cash (P2C) را حذف نصب کنید.

9. یک پیکربندی مستاجر پشتیبانی شده ارائه کنید.

روند

برای همگام‌سازی مشتریان مالی و عملیات D365 با حساب‌های Dataverse، مراحل زیر را دنبال کنید:

مرحله 1: محیط های خود را با جادوگر ضبط دوگانه با کاربری آسان وصل کنید. در مورد این:

1 وارد محیط برنامه Finance & Operations شوید که می خواهید به محیط Dataverse خود متصل شود.

2. به قسمت Workspaces> Data Management بروید و کاشی ذخیره دوگانه را انتخاب کنید.

3. برای باز کردن پیوند راه‌اندازی به Dataverse Wizard، New Environment Connection را انتخاب کنید.

4. صفحه Environment Selection تمام محیط های Dataverse را فهرست می کند که کاربر وارد شده در آن مدیر محیط است. محیط Dataverse مورد نیاز را برای اتصال انتخاب کنید و سپس روی Next کلیک کنید.

5. اشخاص حقوقی خود را انتخاب کرده و سپس Next را انتخاب کنید.

یک بررسی وضعیت انجام می شود تا تأیید شود که سیستم شما شرایط لازم برای فعال کردن ورود دوگانه را دارد. بررسی سلامت نیز تایید می کند که تمام پیش نیازها برآورده شده است. اگر تست سلامتی ناموفق بود، قبل از اینکه به مرحله بعدی بروید، مطمئن شوید که تمام پیش نیازها را رعایت کرده اید.

6. خلاصه، اعلامیه حریم خصوصی و رضایت را مشاهده کنید و اگر با آنها موافق هستید، ایجاد را انتخاب کنید.

شما قبلاً برنامه مالی و عملیات خود را به محیط Dataverse متصل کرده اید.

7. راه حل را برای هماهنگ کردن برنامه های ضبط دوگانه اعمال کنید

شما قبلاً یک راه حل کارت BD منتشر شده توسط مایکروسافت را با موفقیت وارد کرده اید و در محیط خود اعمال کرده اید.

مرحله 2: مشتریان V3 – نقشه جدول حساب ها را فعال کنید

هنگامی که یک نقشه جدول را انتخاب می کنید (به عنوان مثال، V3 Clients — حساب ها) و Execute را انتخاب می کنید، قبل از فعال شدن نقشه جدول، یک کادر محاوره ای ظاهر می شود. این کادر محاوره ای تمام جداول وابسته را فهرست می کند. می‌توانید گزینه Show map (s) of linked tables را انتخاب کنید تا تمام نقشه‌های جدول پیوندی نشان داده شود. برای فعال کردن نقشه جدول انتخابی و تمام جداول مرتبط، اجرا را در کادر محاوره ای انتخاب کنید.

مرحله 3: یک حساب Dataverse جدید ایجاد کنید. صفحه رکورد ایجاد شده در Dataverse در زیر نشان داده شده است:

همانطور که در صفحه زیر نشان داده شده است، ضبط با امور مالی و عملیات همگام شده است.

مرحله 4: یک مشتری جدید در امور مالی و عملیات ایجاد کنید. در زیر صفحه ضبط ایجاد شده در امور مالی و عملیات است.

رکورد با Dataverse همگام شده است.

خلاصه کردن

پس از انجام تمام مراحل فوق، ادغام ضبط دوگانه D365 F&O شما باید تکمیل شود. تعدادی وجود دارد مزایای Dynamics 365 Integration با Dual-write و اطمینان حاصل می کند که تمام داده های شما به طور یکپارچه بین Dataverse و برنامه مالی و عملیات هماهنگ می شوند. امیدواریم این آموزش به شما در رسیدن به هدفتان کمک کرده باشد. منتظر درس های مفیدتر از DEV IT متخصصان برای ساده سازی فرآیند توسعه.

راهنمای تخصصی ادغام D365 F&O و Dataverse با استفاده از کانکتور نوشتن دوگانه اولین بار در مجله DEV IT ظاهر شد.

مراحل ایجاد یک وب سرویس دات نت و استفاده از آن در پروژه D365 F&O


ایجاد یک برنامه وب دات نت در صورتی که به درستی انجام شود می تواند فرآیندی آسان باشد. مهندسان DEV IT ما اینجا هستند تا شما را در فرآیند ایجاد یک وب سرویس در دات نت راهنمایی کنند و سپس آن را در D365 FO مصرف کنند.

ابتدا باید نرخ ارز را با استفاده از http://currencyconverter.kowabunga.NET/converter.asmx به AX وارد کنید.

یک وب سرویس در دات نت ایجاد کنید

قبل از استفاده از وب سرویس خارجی، ابتدا باید یک وب سرویس در پروژه دات نت خود ایجاد کنید. در اینجا مراحلی وجود دارد که باید دنبال کنید:

  • به Visual Studio 2015 بروید و یک پروژه جدید ایجاد کنید
  • برنامه وب ASP.NET را انتخاب کنید
  • به Solution Explorer بروید، روی پروژه خود کلیک راست کرده و Add Service Report را انتخاب کنید.

آدرس وب سرویس http://currencyconverter.kowabunga.NET/converter.asmx را اضافه کنید و روی دکمه «پیشرفته» کلیک کنید، همانطور که در صفحه زیر نشان داده شده است.

پنجره جدیدی مانند تصویر زیر باز می شود:

بر روی دکمه “افزودن مرجع وب” کلیک کنید و URL سرویس وب را اضافه کنید و نام اطلاعات مرجع وب را همانطور که در صفحه زیر نشان داده شده است به روز کنید. وقتی کارتان تمام شد روی «افزودن پیوند» کلیک کنید.

لینک وب مطابق شکل زیر به پروژه شما اضافه می شود:

یک مورد جدید به نام “GetExchangeRate.asmx” اضافه کنید

– یک روش برای دسترسی به روش وب سرویس خارجی با کد زیر اضافه کنید. این به شما امکان می دهد به روش های وب سرویس Kowabunga دسترسی داشته باشید:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using dev_KowabungaWS.KowabungaWR;

namespace dev_KowabungaWS
{
    /// <summary>
    /// Summary description for GetExchangeRate
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class GetExchangeRate : System.Web.Services.WebService
    {

        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }

        [WebMethod]
        public string GetLastUpdateDate()
        {
            KowabungaWR.Converter cr = new KowabungaWR.Converter();
            return cr.GetLastUpdateDate().ToString();

        }

    }
}

– پروژه را بسازید و اجرا کنید و سپس GetExchangeRate.asmx را مطابق شکل زیر به URL اضافه کنید:

برای فراخوانی روش وب سرویس، روی روش GetLastUpdateDate کلیک کنید.

از وب سرویس در پروژه Dynamics خود استفاده کنید

– ایجاد مدل و پروژه برای دینامیک.

روی پروژه Solution Explorer کلیک راست کرده و لینک را اضافه کنید. سپس فایل dll را بررسی کرده و فایل dll پروژه وب سرویس دات نت را به پروژه Dynamics اضافه کنید.

برای تایید سرویس، یک آیتم جدید به نام Runbase Class (Job) اضافه کنید و کد را مطابق شکل زیر وارد کنید:

dev_KowabungaWS.GetExchangeRate KW = new dev_KowabungaWS.GetExchangeRate();
 info(strFmt("%1", KW.GetLastUpdateDate()));

خلاصه کردن

امیدواریم این بررسی به شما در درک پیچیدگی های ایجاد یک وب سرویس دات نت و استفاده از آن در مجموعه D365 FO کمک کند. اگر سوالی در مورد آن دارید، در ارسال نظر خود دریغ نکنید و کارشناسان DEV IT ما خوشحال خواهند شد که به شما کمک کنند.

انتشار مراحل ایجاد یک سرویس وب در دات نت و مصرف در پروژه D365 F&O برای اولین بار در مجله DEV IT ظاهر شد.

نحوه ایجاد یک گردش کار سفارشی در پروژه مالی و عملیات D365


گردش‌های کاری برای ساده‌سازی فرآیندهای تجاری طراحی شده‌اند، در حالی که دستورالعمل‌های واضحی در مورد جریان اسناد و کاربرانی که باید آن را تأیید کنند، ارائه می‌دهند. از آنجایی که هیچ جریان کاری موجود برای قراردادهای خدماتی موجود نیست، ایجاد یک گردش کار سفارشی برای پروژه مالی و عملیاتی D365 بهترین گزینه در اینجا است.

این راهنما هر مرحله لازم برای ایجاد گردش کار سفارشی خود را در Dynamics 365 توضیح می دهد.

Enum را ایجاد کنید

شمارش اصلی برای تعریف وضعیت گردش کار استفاده می شود. در اینجا مراحل لازم برای تعریف آن وجود دارد:

– یک Enum جدید برای وضعیت گردش کار ایجاد کنید

یک فیلد جدید در جدول ایجاد کنید

– در اینجا از جدول SMAAgreementTable به عنوان مثال استفاده می کنیم. پسوند جدول ایجاد کنید و Enum را به جدول بکشید.

روش هایی را روی میز ایجاد کنید

سپس باید با استفاده از مراحل زیر متدهایی را در جدول ایجاد کنید:

  • یک کلاس جدید ایجاد کنید و نام آن را “devSMAAgreementTable_Extension” بگذارید
  • جدول SMAAgreementTable را گسترش دهید.
  • روش هایی را با نام های زیر ایجاد کنید
    • canSubmitToWorkflow
    • UpdateCustWorkflowState
  • روش canSubmitToWorkflow از زنجیره ای از دستورات برای کلمه کلیدی بعدی استفاده می کند.
public boolean canSubmitToWorkflow(str _workflowType)
    {
        boolean ret = next canSubmitToWorkflow(_workflowType);

        ret = this.RecId != 0 && this.workflowStatus == workflowstatus::Draft;

        return ret;
    }

یک پرس و جو جدید ایجاد کنید

ایجاد یک پرس و جو جدید آسان است:

  • در اینجا از کوئری SMAAgreementTableListPage استفاده می کنیم

یک دسته گردش کار ایجاد کنید

  • روی Add> New Item> Business Process and Workflow> Workflow Category کلیک کنید
  • لطفا یک نام معتبر وارد کنید
  • خواص را مطابق شکل زیر تنظیم کنید
    • برچسب = “دسته گردش کار قرارداد خدمات”
    • Module = Salesorder (از این به بعد یک گردش کار به AR اضافه می کنیم. بنابراین گردش کار در زیر ماژول AR لیست می شود)

یک نوع گردش کار ایجاد کنید

  • یک نوع گردش کار جدید با مراحل زیر ایجاد کنید:
    • روی Add> New Item> Business Process and Workflow> Workflow Type کلیک کنید

– کلاس devServiceAgreementWFTypeEventHandler را مطابق شکل زیر ویرایش کنید

public void started(WorkflowEventArgs _workflowEventArgs)
	{
        SMAAgreementTable::UpdateCustWorkflowState(_workflowEventArgs.parmWorkflowContext().parmRecId(), workflowstatus::Pending);
	}

    public void canceled(WorkflowEventArgs _workflowEventArgs)
	{
        SMAAgreementTable::UpdateCustWorkflowState(_workflowEventArgs.parmWorkflowContext().parmRecId(), workflowstatus::Cancel);
	}

    public void completed(WorkflowEventArgs _workflowEventArgs)
	{
        SMAAgreementTable::UpdateCustWorkflowState(_workflowEventArgs.parmWorkflowContext().parmRecId(), workflowstatus::Completed);
	}

– کد زیر را در کلاس مدیر ارسال بنویسید

public static void main(Args _args)
	{
        SMAAgreementTable							ObjSMAAgreementTable;
        devServiceAgreementWFTypeSubmitManager		submitManger = new devServiceAgreementWFTypeSubmitManager();
        recId _recId =								_args.record().RecId;
        WorkflowCorrelationId						_workflowCorrelationId;
 
        workflowTypeName							_workflowTypeName = workFlowTypeStr("devServiceAgreementWFType");
        WorkflowComment								note = "";
        WorkflowSubmitDialog						workflowSubmitDialog;
        							           
        //Opens the submit to workflow dialog.
        workflowSubmitDialog = WorkflowSubmitDialog::construct(_args.caller().getActiveWorkflowConfiguration());
        workflowSubmitDialog.run();

        if (workflowSubmitDialog.parmIsClosedOK())
        {
            ObjSMAAgreementTable = _args.record();
            // Get comments from the submit to workflow dialog.
            note = workflowSubmitDialog.parmWorkflowComment();

            try
            {
                ttsbegin;
                // Activate the workflow.
                _workflowCorrelationId = Workflow::activateFromWorkflowType(_workflowTypeName, ObjSMAAgreementTable.RecId, note, NoYes::No);


                ObjSMAAgreementTable.workflowstatus = workflowstatus::Submitted;
                ObjSMAAgreementTable.update();
                ttscommit;

                // Send an Infolog message.
                info("Submitted to workflow.");
            }
            catch (Exception::Error)
            {
                error("Error on workflow activation.");
            }
        }


        _args.caller().updateWorkFlowControls();
	}

ایجاد تایید گردش کار

– برای ایجاد تأیید گردش کار، کافی است روی Add> New Item> Business Process and Workflow> Workflow Approval کلیک کنید.

– کلاس مدیریت رویداد devServiceAgreementWFApprovalEventHandler را به روز کنید

public void started(WorkflowElementEventArgs _workflowElementEventArgs)
	{
        SMAAgreementTable::UpdateCustWorkflowState(_workflowElementEventArgs.parmWorkflowContext().parmRecId(),workflowstatus::Submitted);
	}

    public void canceled(WorkflowElementEventArgs _workflowElementEventArgs)
	{
        SMAAgreementTable::UpdateCustWorkflowState(_workflowElementEventArgs.parmWorkflowContext().parmRecId(),workflowstatus::Cancel);
	}

    public void completed(WorkflowElementEventArgs _workflowElementEventArgs)
	{
        SMAAgreementTable::UpdateCustWorkflowState(_workflowElementEventArgs.parmWorkflowContext().parmRecId(),workflowstatus::Approved);
	}

    public void denied(WorkflowElementEventArgs _workflowElementEventArgs)
	{
        SMAAgreementTable::UpdateCustWorkflowState(_workflowElementEventArgs.parmWorkflowContext().parmRecId(),workflowstatus::Rejected);
	}

    public void changeRequested(WorkflowElementEventArgs _workflowElementEventArgs)
	{
        SMAAgreementTable::UpdateCustWorkflowState(_workflowElementEventArgs.parmWorkflowContext().parmRecId(),workflowstatus::ChangeRequest);
	}

تأیید گردش کار را به نوع گردش کار اضافه کنید

– یک مورد برای تأیید نوع گردش کار در devServiceAgreementWFType> موارد پشتیبانی شده ایجاد کنید

– گردش کار در فرم را فعال کنید

– یک گردش کار ایجاد کنید

خلاصه کردن

امیدواریم این درس ادامه داشته باشد ایجاد دینامیک فعالیت گردش کار سفارشی 365 مفید و آسان برای پیگیری بود. اگر هنوز چند سؤال در مورد فرآیند یا هر سؤال دیگری در رابطه با پروژه D365 خود دارید، همین امروز با تیم کارشناسان DEV IT ما تماس بگیرید. آنها به شما کمک خواهند کرد که بیشترین استفاده را از خود ببرید فرآیند توسعه در D365.

انتشار نحوه ایجاد یک گردش کار سفارشی در پروژه مالی و عملیات D365 برای اولین بار در مجله DEV IT ظاهر شد.

مراحل ادغام MS Office با D365 Finance & Operations


ادغام MS Office 365 F&O یک ابزار عالی است که به شما مزیتی را با محیطی سازنده می دهد که به شما کمک می کند کار را در امور مالی و عملیاتی انجام دهید. راه اندازی آن یک فرآیند آسان است و این وبلاگ شما را در هر مرحله راهنمایی می کند.

1 چگونه با MS Excel 365 یکپارچه شویم؟

در اینجا مراحل تکمیل ادغام با MS Excel 365 آمده است:

  • MS Excel را به صورت محلی روی رایانه خود نصب کنید.
  • MS Excel را باز کنید
  • به مسیر Insert> My Add-ons> Microsoft Dynamics Office Add-in بروید. با این کار افزونه Microsoft Dynamics Office نصب و فعال می شود.
  • با کلیک بر روی Microsoft Dynamics Office Add-in پنجره جدیدی در سمت راست صفحه باز می شود. در اینجا او اتصال D365 F&O را که روی سرور شما نصب شده است ارائه می دهد.
  • سپس باید با حساب مایکروسافت خود وارد شوید.
  • پس از ورود به سیستم، کانکتور داده برای بازیابی موارد موجود شما از D365 F&O فعال می شود. شما باید روی Design کلیک کنید و سپس منبع داده را برای شی انتخاب کنید. روی Next کلیک کنید و فیلدهای کاربرگ اکسل شما ظاهر می شود.
  • برای نمایش داده ها در اکسل روی دکمه refresh کلیک کنید و اکنون می توانید رکوردهای اکسل را ایجاد، به روز رسانی یا حذف کنید و آنها را منتشر کنید.

2. صادرات به اکسل و باز کردن در اکسل

بیایید به عملکردهای صادرات به اکسل و باز کردن ادغام Dynamic 365 Finance و توسعه عملیات در اکسل نگاه کنیم:

صادرات به اکسل

  • گزینه Export to Excel برای تولید صادرات استاتیک داده از شبکه است.

در اکسل باز کنید

  • گزینه Open in Excel از افزونه اکسل استفاده می کند تا به روزرسانی و انتشار آن آسان تر شود.
  • فیلدهای پیش فرضی که به کتاب کار اضافه می شوند، فیلد کلید و فیلدهای مورد نیاز شی هستند. اگر مجموعه دیگری از فیلدها به طور پیش فرض ارائه شده باشد، می توان این فیلدها را به آن اضافه کردگروه فیلد گزارش خودکارروی موضوع.

3. پیکربندی ایمیل (SMTP / Exchange)

در اینجا مراحل پیکربندی ایمیل شما برای کار با ادغام آمده است. با هر دو سرویس گیرنده ایمیل SMTP و MS Exchange کار می کند:

فرم تنظیمات ایمیل و راه اندازی را باز کنید

روی System Administrator > Email Setup > Email Setup کلیک کنید

4. پیوست به شیرپوینت

برای اشتراک گذاری اسناد خود در شیرپوینت، ابتدا باید چند مورد را پیکربندی کنید. در اینجا چیزی است که شما باید انجام دهید:

  • یک سایت شیرپوینت ایجاد کنید
    • پیوند را در سایت شیرپوینت کپی کرده و در D365 F&O پیکربندی کنید. برای انجام این کار، روی گزینه Organization Administrator > Document Management > Document Management Parameter کلیک کنید
  • به Attachment and Document Type رفته و پوشه مقصد مورد نظر را در سایت شیرپوینت مشخص کنید.
    • روی سازمان مدیر > مدیریت اسناد > انواع اسناد کلیک کنید

خلاصه کردن

با انجام تمام مراحل، ادغام دفتر MS برای امور مالی و عملیات D365 تکمیل خواهد شد. امیدواریم این آموزش برای شما آسان باشد و به شما کمک کند همه چیز را در چند ثانیه تنظیم کنید. با این حال، اگر در طول فرآیند با مشکلی مواجه شدید، لطفا در تماس نباشید DEV IT کارشناسان

انتشار مراحل ادغام MS Office با D365 Finance & Operations اولین بار در مجله DEV IT ظاهر شد.

راهنمای گام به گام ایجاد یک Restful Dynamics AX Data API


Dynamics AX یک برنامه اختصاصی است که توسط مایکروسافت برای پردازش و راه حل های ERP ایجاد شده است. دارای سیستم های داخلی است که به شرکت ها کمک می کند تا سیستم های پردازش داده خود را سازماندهی، خودکار و بهینه کنند. یکی از جنبه های پردازش داده، ادغام یکپارچه آنها با سایر برنامه های اکوسیستم ERP است.

ایجاد این ارتباط بین برنامه ها با API انجام می شود. به طور کلی، Restful API زمانی قابل استفاده است که شما نیاز به ادغام بین دو برنامه داشته باشید. در این وبلاگ، من به مراحل ایجاد یک Restful API برای ادغام با Microsoft Dynamics AX Data و نحوه آزمایش آن با استفاده از Postman نگاه کردم.

آرام API

Restful API برای ادغام دو برنامه با هم استفاده می شود تا آنها در هماهنگی مناسب کار کنند. اگر علاقه مند به ایجاد برنامه ASP .NET خود هستید، Restful API ابزار مهمی برای کمک به شما در انجام آن خواهد بود.

فرمت URL API Restful این است: {Localhost: IP / Domain site} / api / {Controller}

مواد و روش ها:

روش های مورد نیاز برای ایجاد Restful API عبارتند از:

یک برنامه ASP.Net ایجاد کنید

برنامه ASP.NET خود را در آن بسازید ویژوال استودیو 2015 و مراحل زیر را دنبال کنید در اینجا مراحل مورد نیاز برای رسیدن به این هدف وجود دارد:

  1. قابل اعتماد و متخصص فایل > جدید > پروژه
  2. انتخاب کنید دسته پروژه Visual C # و سپس ASP.NET Web Application (.NET Framework) را انتخاب کنید.
  3. پروژه خود را نام ببرید RestAPI و کلیک کنید خیلی خوب
  4. انتخاب کنید خالی الگوی پروژه را کلیک کنید و روی OK کلیک کنید (برای افزودن پیوندهای اصلی کادرها را علامت نزنید)

بسته های NuGet را اضافه کنید

برای مرحله بعدی باید چند مورد را بردارید بسته های NuGet. برای نصب آنها از دستورات زیر در کنسول Package Manager استفاده کنید:

  • بسته نصب Microsoft.AspNet.WebApi
  • بسته نصب Microsoft.Owin.Host.SystemWeb
  • بسته نصب Microsoft.AspNet.WebApi.OwinSelfHost

یک کلاس شروع اضافه کنید

حالا روی پروژه خود کلیک راست کرده و انتخاب کنید افزودن> کلاس و آن را به عنوان نامگذاری کنید Startup.cs. کد زیر را کپی کرده و در فایل جدید پیست کنید:

using System.Web.Http;
using Newtonsoft.Json.Serialization;
using Owin;

namespace RestAPI
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();

            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            config.Formatters.Remove(config.Formatters.XmlFormatter);
            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc;
            app.UseWebApi(config);
        }
    }
}

در کد بالا، قسمت‌هایی که با رنگ زرد مشخص شده‌اند برای حذف XmlFormatter (که فرمت‌کننده خروجی پیش‌فرض است) و در عوض پیکربندی استفاده می‌شوند. JsonFormatter برای نام اموال شتر و برای استفاده زمان UTC برای تاریخ ها.

API داده استاتیک

یک کنترلر اضافه کنید

حالا باید a اضافه کنید کنترل کننده پوشه ها به پروژه شما وقتی کارتان تمام شد، روی پوشه Controllers کلیک راست کرده و انتخاب کنید افزودن> موارد جدید سمت چپ را انتخاب کنید Visual C #> Web> Web API. سپس بر روی کلیک کنید کلاس کنترلر Web API (نسخه 2.1)نام ببرید Controller.csو کلیک کنید اضافه کردن.

اکنون باید یک کنترلر با متدهایی برای آن داشته باشید بگیر، پست، قرار دادمو حذف لیست اقلام. بیایید آن را آزمایش کنیم.

مطبوعات F5 برای اجرای API خود پس از باز شدن مرورگر، اضافه کنید / api / listitems به انتهای URL بروید و فشار دهید وارد

یک مدل اضافه کنید

من می آفرینم – درست می کنم منبع و ASP.NET اقدامات Web API

حالا اجازه دهید این API کار مفیدی انجام دهد. برای این بخش، یک منبع برای یک آیتم لیست ایجاد می‌کنید و تمام اقدامات کنترلر را به هم پیوند می‌دهید تا بتوانید موارد را ایجاد، بخوانید، به‌روزرسانی و حذف کنید.

ادامه دهید و a ایجاد کنید مدل ها در پروژه خود پوشه کنید و a اضافه کنید CustomListItem.cs کلاس می بایست شبیه به این باشه:

ساختار CustomListItem.cs باید با توجه به داده های منتشر شده تعریف شود.

در زیر CustomListItem.cs برای مرجع شما آمده است:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace RestAPI.Models
{
    public class CustomListItem
    {
        public int Id { get; set; }
        public string Text { get; set; }
    }
}

متدهای دریافت / ارسال را به کنترلر اضافه کنید

برگشت به مال شما ListItemsController کلاس، a اضافه کنید دارایی استاتیک خصوصی برای ذخیره آیتم های لیست خود در حافظه اموال خصوصی را به اعلان کلاس اضافه کنید.

private static List<CustomListItem> _listItems { get; set; } = new List<CustomListItem>();
You will also need to add a using statement to the top of the controller.
using RestAPI.Models;
To read items, update the Get method as shown below:
public IEnumerable<CustomListItem> Get()
 {
            return _listItems;
 }
To create items, update the Post method as specified below:
public HttpResponseMessage Post([FromBody]CustomListItem model)
{
            if (string.IsNullOrEmpty(model?.Text))
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest);
            }
            var maxId = 0;
            if (_listItems.Count > 0)
            {
                maxId = _listItems.Max(x => x.Id);
            }
            model.Id = maxId + 1;
            _listItems.Add(model);
            return Request.CreateResponse(HttpStatusCode.Created, model);
}

برنامه را ایجاد و اجرا کنید و روش انتشار Postman را به صورت زیر آزمایش کنید:

روش رو بگیر

روش انتشار

پس از انتشار یک روش دریافت کنید

API با داده های AX

یک کنترلر اضافه کنید

حالا باید a اضافه کنید پوشه کنترلر به پروژه شما سپس روی پوشه Controllers راست کلیک کرده و انتخاب کنید افزودن> آیتم جدیدسمت چپ را انتخاب کنید Visual C #> Web> Web API. سپس بر روی کلیک کنید کلاس کنترلر Web API (نسخه 2.1)نام ببرید Controller.csو کلیک کنید اضافه کردن.

اکنون باید یک کنترلر با متدهایی برای آن داشته باشید بگیر، پست، قرار دادمو حذف لیست اقلام. بیایید آن را آزمایش کنیم.

مطبوعات F5 برای اجرای API خود پس از باز شدن مرورگر، اضافه کنید / api / AxTrainings به انتهای URL بروید و فشار دهید وارد

یک مدل اضافه کنید

من می آفرینم – درست می کنم منبع و ASP.NET اقدامات Web API

اضافه کردن AxTrainings کلاس در RestAPI.Models، همانطور که در زیر نشان داده شده است:

public class AXTrainings
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public string TrainingDate { get; set; }
 }

با استفاده از کانکتور تجاری به AX متصل شوید

برای اتصال به کانکتور تجاری، مانند شکل زیر، یک مرجع به فایل dll Business Connectors از پوشه Bin کلاینت AX اضافه کنید:

ج: فایلهای برنامه (x86) 60 مشتری Bin

بیانیه استفاده را به صورت زیر اضافه کنید:

استفاده از Microsoft.Dynamics.BusinessConnectorNet.

متدهای دریافت / ارسال را به کنترلر اضافه کنید

برگشت به مال شما کنترلر AxTrainings کلاس، a اضافه کنید دارایی استاتیک خصوصی برای ذخیره آیتم های لیست خود در حافظه اموال خصوصی را به اعلان کلاس اضافه کنید.

private static List<AXTrainings> _AxTrainings { get; set; } = new List<AXTrainings>();

شما همچنین باید یک را اضافه کنید استفاده از بیانیه به بالای کنترلر

using RestAPI.Models;

برای خواندن AxTrainings از AX، متد Get را به صورت زیر به روز کنید:

public IEnumerable<AXTrainings> Get()
        {
            // return new string[] { "value1", "value2" };
            AXTrainings objAXTrainings;
            Axapta ax;
            AxaptaRecord axRecord;

            string tableName = "Dev_Trainings";
            string strId = "Id";
            string strName = "Name";
            string strTrainingDate = "TrainingDate";

            object fieldId, fieldName, fieldTrainingDate;
            
            try
            {

                ax = new Axapta();
                ax.Logon("USMF", "en-us", "TAURUS", null);
                _AxTrainings.Clear();
                using (axRecord = ax.CreateAxaptaRecord(tableName))
                {
                    axRecord.ExecuteStmt("select * from %1 ");
                    
                    while (axRecord.Found)
                    {
                        fieldId = axRecord.get_Field(strId);
                        fieldName = axRecord.get_Field(strName);
                        fieldTrainingDate = axRecord.get_Field(strTrainingDate);
                        objAXTrainings = new AXTrainings();
                        objAXTrainings.Id = fieldId.ToString();
                        objAXTrainings.Name = fieldName.ToString();
                        objAXTrainings.TrainingDate = fieldTrainingDate.ToString();

                        _AxTrainings.Add(objAXTrainings);
                        
                        axRecord.Next();
                    }
                }
                return _AxTrainings;
            }

            catch (Exception e)
            {
                //return e.Message;                
            }
            return _AxTrainings;


        }

برای ایجاد AxTraining، متد Post را به صورت زیر به روز کنید:

public HttpResponseMessage Post([FromBody]AXTrainings objAXTrainings)
        {
            
            Axapta ax;
            AxaptaRecord axRecord;
            string tableName = "Dev_Trainings";

            if (string.IsNullOrEmpty(objAXTrainings?.Name))
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest);
            }
            // insert record in ax
            try
            {

                ax = new Axapta();
                ax.Logon("USMF", "en-us", "TAURUS", null);
                _AxTrainings.Clear();
                using (axRecord = ax.CreateAxaptaRecord(tableName))
                {

                    axRecord.set_Field("Id", objAXTrainings.Id);
                    axRecord.set_Field("Name", objAXTrainings.Name);
                    axRecord.set_Field("TrainingDate", objAXTrainings.TrainingDate);
                    
                    // Commit the record to the database.
                    axRecord.Insert();
                    
                }
                return Request.CreateResponse(HttpStatusCode.Created, objAXTrainings);
            }
            
            catch (Exception e)
            {
                objAXTrainings = new AXTrainings();
                return Request.CreateResponse(HttpStatusCode.Created, objAXTrainings);
            }
            
        }

برنامه را ایجاد و اجرا کنید و روش انتشار Postman را به صورت زیر آزمایش کنید:

روش رو بگیر

روش انتشار

پس از انتشار یک روش دریافت کنید

لینک مرجع:

https://developer.okta.com/blog/2019/03/13/build-rest-api-with-aspnet-web-api

قلاب وب:

Webhook ابزاری است که بلافاصله پس از وقوع یک رویداد خاص، داده ها را از یک برنامه به برنامه دیگر تحویل می دهد. Webhook برای دریافت داده های بلادرنگ بین دو برنامه استفاده می شود.

خلاصه کردن

انجام تمام مراحل ذکر شده در بالا به شما کمک می کند تا برنامه ASP .NET خود را بدون مواجهه با خطاهای معمولی ایجاد کنید. امیدواریم این وبلاگ برای روشن کردن همه چیز در مورد فرآیند توسعه ASP .NET مفید بوده باشد. لطفاً در تماس با مهندسان ما در DEV IT برای هرگونه مشکل در حال انجام در مرحله توسعه تردید نکنید.

راهنمای گام به گام ایجاد یک API آرامش بخش برای داده های Dynamics AX برای اولین بار در مجله DEV IT ظاهر شد.

راهنمای حذف فایل ها و پوشه های ناخواسته از مخزن GitHub


معرفی

همانطور که توسعه دهندگان امروزی روی هر پروژه کار می کنند، احتمالاً از GitHub برای حفظ کد و کنترل ویرایش و استقرار استفاده می کنند. بنابراین، آنها فایل‌های commit مختلف یا حتی پوشه‌های کاملی را ایجاد می‌کنند که مرتبط با پروژه نیستند، اما در عوض حاوی کدهایی هستند که می‌تواند برای خود پروژه آسیب‌پذیری ایجاد کند. آنها همچنین گاهی اوقات می توانند اطلاعات محرمانه ای در مورد شرکت داشته باشند و افشای آن به صورت آنلاین می تواند فاجعه آمیز باشد.

برای کمک به جلوگیری از چنین حوادثی، متخصص DEV IT ما این پست وبلاگ را آماده کرده است تا به شما کمک کند فایل‌ها و پوشه‌ها را از مخزن GitHub خود حذف کنید.

مراحل راهنمایی برای انجام این فعالیت

توجه: افرادی که مجوز ذخیره سازی دارند می توانند نام یک شاخه را در مخزن تغییر دهند. افرادی که دارای امتیازات مدیریتی هستند می توانند شعبه پیش فرض را تغییر نام دهند.

2 راه ممکن برای حذف فایل ها / پوشه ها از مخزن وجود دارد.

  1. دستورات استاندارد GitHub
  2. استفاده از BFG Repo-Cleaner (به عنوان یک برنامه)

بیایید ببینیم روش اول حذف فایل ها / پوشه ها از ذخیره سازی چگونه کار می کند.

1. با استفاده از خط فرمان استاندارد GitHub:

  • ذخیره سازی دستگاه خود را شبیه سازی کنید: git clone repo_URL
  • به پوشه ذخیره سازی خود بروید: CD folder_repo_na
  • برای ریموت ج git branch -r | grep -v /HEAD; پرداخت git – ردیابی $ از راه دور. انجام شده

توجه داشته باشید: مراحل d و e را برای هر پوشه به ترتیب تکرار کنید

  • git filter-branch –index-filter ‘git rm -rf –cached – ignore-unmatch

DIRECTORY_NAME / ‘–sune-empty –tag-name-filter cat – –همه

  • git for-each-ref –format = ”% (refname)” refs / original / | xargs -n 1 git update-ref -d
  • rm -Rf .git / logs .git / refs / original
  • git gc –prune = همه – مهاجم

توجه داشته باشید: مراحل h و I همه شاخه ها و برچسب های ذخیره سازی را فشار می دهند.

  • git push origin –all –force
  • git push origin –tags –force
  • اندازه ذخیره سازی را بررسی کنید: git تعداد اشیاء -vH

2. روش دوم با استفاده از ابزار BFG Repo-Cleaner ساده است.

این روش یک جایگزین ساده تر و سریعتر برای git-filter-branch برای پاک کردن داده های بد از تاریخچه مخزن Git شما است:

  1. فایل های بزرگ دیوانه را حذف کنید
  2. حذف رمز عبور، اعتبار و سایر اطلاعات شخصی

که در git-filter-branch دستور فوق العاده قدرتمند است و می تواند کارهایی را انجام دهد که BFG نمی تواند انجام دهد – اما BFG برای کارهای بالا بسیار بهتر است زیرا:

  • ابتدا مخزن خود را کلون کنید

git clone – bare https: // project / repository project-repository

  • به پوشه ذخیره سازی خود بروید

پروژه ذخیره سازی سی دی

  • A. برای حذف پوشه، از دستور زیر استفاده کنید – java -jar bfg.jar – پوشه‌های DIRECTORY_NAME را حذف کنید

ب. برای حذف فایل ها – java -jar bfg.jar – حذف فایل ها * .extension

  • BFG commit و تمام شاخه‌ها و برچسب‌ها را به‌روزرسانی می‌کند تا تمیز باشند، اما موارد ناخواسته را به صورت فیزیکی حذف نکنید. مخزن را بررسی کنید تا مطمئن شوید تاریخچه شما به روز است و سپس از استاندارد استفاده کنید git gc دستور حذف داده های کثیف ناخواسته که Git اکنون آنها را به عنوان زائد تشخیص می دهد:

git reflog expire –expire = now –all && git gc –prune = now –aggressive

  • کد را به حافظه راه دور خود ارسال کنید

git push – آینه https: // پروژه / مخزن جدید

خلاصه کردن

پس از انجام تمام مراحل ذکر شده در بالا، باید بتوانید تمام فایل ها و پوشه های غیر ضروری را از فضای ذخیره سازی GitHub خود حذف کنید. لطفاً توجه داشته باشید که این یک HASH جدید برای تعاملات و تاریخچه ایجاد می کند. اگر در مورد GitHub گیر کرده اید یا سؤالی دارید، لطفاً در نظرات خود دریغ نکنید یا در وب سایت ما با ما تماس بگیرید.

راهنمای مخزن GitHub برای حذف فایل‌ها و پوشه‌های ناخواسته برای اولین بار در مجله DEV IT ظاهر شد.

چگونه می توانم یک شاخه اصلی GitHub را به یک شاخه اصلی تغییر نام دهم؟


معرفی

GitHub یکی از مفیدترین ابزارها در زرادخانه توسعه دهندگان امروزی است که چندین سازمان از Git برای کنترل و پیاده سازی کد استفاده می کنند. گیت هاب اخیراً پروپوزال Conservancy را پیاده سازی کرده و در هنگام راه اندازی یک مخزن جدید از عبارت master استفاده نمی کند. شعبه اصلی اکنون شاخه اصلی نامیده می‌شود و GitHub گفته است که پروژه‌ها را تشویق می‌کند تا به نام‌های شعبه‌ای که معنی‌دار و شامل هستند حرکت کنند، در حالی که استفاده از نام پیش‌فرض جدید را برای آنها آسان‌تر می‌کند. این کار پس از اعتراضات سال 2020 انجام شد که مشخص شد اصطلاح استاد برای مردم توهین آمیز است.

اگر می خواهید نام شعبه GitHub خود را نیز تغییر دهید، این وبلاگ به شما کمک می کند تا در چند مرحله ساده به آن دست یابید:

راهنمای تغییر نام شعبه

توجه: افرادی که مجوز ذخیره سازی دارند می توانند نام یک شاخه را در مخزن تغییر دهند. افرادی که دارای امتیازات مدیریتی هستند می توانند شعبه پیش فرض را تغییر نام دهند.

1 ابتدا ذخیره سازی را در محلی خود شبیه سازی کنید.

git clone repo_url

2. شعبه صندوقداری که می خواهید نام آن را تغییر دهید. مثلا، “استادبرای تغییر نامرئیس“.

استاد پرداخت git

3. خود را حرکت دهیدشعبه_نام_برای_نام” به “نام new_clone”-

git branch -m chief chief

4. نام شعبه جدید خود را به مخزن GitHub ارسال کنید

git push -u اصل اصلی

(در اینجا -u به طور همزمان شعبه جدید را به صورت پیش فرض محلی تنظیم می کند)

راه دور git set-head main origin

(این خط تضمین می کند که HEAD محلی ما به شعبه جدید ما در GitHub اشاره می کند)

5. شاخه ها را بررسی کنید و می توانید پیدا کنید مبدا / فصل -> مبدا / اصلی

git clone -r

6. به GitHub بروید و شاخه پیش فرض خود را به شاخه جدید ایجاد شده تغییر دهید. اگر شاخه اصلی یا پیش فرض نیست، از این مرحله رد شوید. برای رسیدن به این هدف، به تنظیمات ذخیره سازی خود > شاخه ها بروید و شاخه پیش فرض را انتخاب کنید.

7. شاخه قدیمی را حذف کنید. قبل از انجام این مرحله، به مخزن GitHub خود بروید و ببینید آیا شعبه جدید شما در لیست ظاهر می شود یا خیر.

git push origin – اصلی را حذف کنید

8. در این مرحله باید کد، اسکریپت ها، اتوماسیون، ادغام های خود را برای پیوند به شعبه اصلی بررسی کنید. به عنوان مثال، فایل هایی مانند: travis.yml، .github / workflows /، .circleci / config.yml و غیره را بررسی کنید. و مطمئن شوید که هیچ سرویس خارجی یا اتصالی وجود ندارد که به شعبه اصلی متکی باشد یا به آن مراجعه کند.

9. Git برخی از دستورات محلی مانند git init بنابراین شما می توانید ایجاد کنید git new use دستور زیر:

git config –global alias.new ‘! git init && git symbolic-ref HEAD refs / heads / main’

نکته: در حین تغییر نام سایر شاخه ها، مبدا شاخه پیش فرض خود را تنظیم کنید. این را می توان از طریق مرحله 8 به دست آورد، فقط نام شعبه پیش فرض را تغییر دهید.

چه تیمی باید دنبال شود

در داخل تیم، اگر یک کلون ذخیره سازی محلی دارند، باید مراحل زیر را انجام دهند:

  1. شعبه اصلی صندوق: استاد پرداخت git
  2. نام آن را خیلی ابتدایی تغییر دهید: git branch -m chief chief
  3. دریافت آخرین تعهدات: استخراج git
  4. پیوندهای ردیابی موجود را حذف کنید: git clone – unset-upstream
  5. ایجاد لینک های ردیابی جدید: git clone -u origin / main

چیزهایی که باید در نظر داشت

تغییر نام یک شعبه وحشتناک یا پیچیده نیست.

همیشه باید از فضای بازیابی خود نسخه پشتیبان تهیه کنید.

خلاصه کردن

این راهنما نحوه تغییر نام شعبه خود را به نامی خلاقانه تر و فراگیرتر با توجه به نکات GitHub و Conservancy توضیح می دهد. با انجام تمام مراحل ذکر شده در بالا، باید بتوانید بدون هیچ مشکلی به این مهم برسید. با این حال، اگر در مورد GitHub یا موضوعات مرتبط سؤالی دارید، دریغ نکنید با ما تماس بگیرید DEV IT مهندسین اطلاعات

ممکن است بیشتر دوست داشته باشید

  • فایل ها و پوشه های ناخواسته را از مخزن GitHub حذف کنید

پست چگونه یک شاخه اصلی گیت هاب را به شاخه اصلی تغییر نام دهیم؟ برای اولین بار در مجله DEV IT ظاهر شد.