سری آموزشی مقدماتی Web API
Our beginner's guide to building Web APIs with ASP.NET Core is designed to provide you with the foundation you need to start building Web APIs with .NET in a collection of short, pragmatic collection of videos. Web APIs have become a critical component in almost every type of software we use today. In this introductory video series, we will walk you through the fundamental concepts you need to know to get started with building Web APIs using ASP.NET Core. We will cover topics such as routing, validation, working with data, and much more.
نگاهی به asynchronous در ES7
تزریق وابستگی ها در Asp.net MVC 5
If you are using StructreMap to resolve the dependencies in the ASP.NET MVC 5 application then Steve Smith’s blog postResolving Dependencies in ASP.NET MVC 5 with StructureMap can be a great help for you
PSScriptAnalyzer is a static code checker for PowerShell modules and scripts. PSScriptAnalyzer checks the quality of PowerShell code by running a set of rules. The rules are based on PowerShell best practices identified by PowerShell Team and the community. It generates DiagnosticResults (errors and warnings) to inform users about potential code defects and suggests possible solutions for improvements.
معرفی Dotnet-Monitor
When running a dotnet application differences in diverse local and production environments can make collecting diagnostics artifacts (e.g., logs, traces, process dumps) challenging. dotnet-monitor
aims to simplify the process by exposing a consistent REST API regardless of where your application is run.
پیاده سازی RabbitMQ
- یک پروژه از نوع Asp.Net Core Web Application ایجاد میکنیم به نام RabbiMqExample.Producer که همان ارسال کننده (Producer) میباشد.
- یک پروژه از نوع Asp.Net Core Web Application به نام RabbitMqExample.Consumer برای دریافت کننده (Consumer).
- یک پروژه از نوع Class library .Net Core به نام RabbitMqExample.Common که شامل سرویسها و مدلهای مشترک بین Producer و Consumer میباشد.
public class RabbitMqConfiguration { public string HostName { get; set; } public string Username { get; set; } public string Password { get; set; } }
public interface IRabbitMqService { IConnection CreateChannel(); } public class RabbitMqService : IRabbitMqService { private readonly RabbitMqConfiguration _configuration; public RabbitMqService(IOptions<RabbitMqConfiguration> options) { _configuration = options.Value; } public IConnection CreateChannel() { ConnectionFactory connection = new ConnectionFactory() { UserName = _configuration.Username, Password = _configuration.Password, HostName = _configuration.HostName }; connection.DispatchConsumersAsync = true; var channel = connection.CreateConnection(); return channel; } }
public static class StartupExtension { public static void AddCommonService(this IServiceCollection services, IConfiguration configuration) { services.Configure<RabbitMqConfiguration>(a => configuration.GetSection(nameof(RabbitMqConfiguration)).Bind(a)); services.AddSingleton<IRabbitMqService, RabbitMqService>(); } }
<ItemGroup> <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="5.0.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="5.0.0" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="5.0.0" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="5.0.0" /> <PackageReference Include="Microsoft.Extensions.Options" Version="5.0.0" /> <PackageReference Include="RabbitMQ.Client" Version="6.2.1" /> </ItemGroup>
public interface IConsumerService { Task ReadMessgaes(); } public class ConsumerService : IConsumerService, IDisposable { private readonly IModel _model; private readonly IConnection _connection; public ConsumerService(IRabbitMqService rabbitMqService) { _connection = rabbitMqService.CreateChannel(); _model = _connection.CreateModel(); _model.QueueDeclare(_queueName, durable: true, exclusive: false, autoDelete: false); _model.ExchangeDeclare("UserExchange", ExchangeType.Fanout, durable: true, autoDelete: false); _model.QueueBind(_queueName, "UserExchange", string.Empty); } const string _queueName = "User"; public async Task ReadMessgaes() { var consumer = new AsyncEventingBasicConsumer(_model); consumer.Received += async (ch, ea) => { var body = ea.Body.ToArray(); var text = System.Text.Encoding.UTF8.GetString(body); Console.WriteLine(text); await Task.CompletedTask; _model.BasicAck(ea.DeliveryTag, false); }; _model.BasicConsume(_queueName, false, consumer); await Task.CompletedTask; } public void Dispose() { if (_model.IsOpen) _model.Close(); if (_connection.IsOpen) _connection.Close(); } }
- پارامتر اول، اسم queue میباشد
- پارامتر durable مشخص میکند که دادهها به صورت مانا باشند یا نه. اگر برابر true باشد، دیتاهای مربوط به queueها، در دیسک ذخیره میشوند؛ اما اگر برابر false باشد، بر روی حافظه ذخیره میشوند. در محیطهایی که مانایی اطلاعات مهم میباشد، باید مقدار این پارامتر را true کنید.
- پارامتر سوم: اطلاعات بیشتر
- پارامتر autoDelete اگر برابر true باشد، زمانی که تمامی Consumerها ارتباطشان با RabbitMq قطع شود، queue هم پاک میشود. اما اگر برابر true باشد، queue باقی میماند؛ حتی اگر هیچ Consumer ای به آن وصل نباشد.
- نام Exchange
- نوع Exchange که میتواند Headers , Topic , Fanout یا Direct باشد. اگر برابر Fanout باشد و اگر دادهای وارد Exchange شود، آنرا به تمامی queue هایی که به آن بایند شدهاست، ارسال میکند. اما اگر نوع آن Direct باشد، داده را به یک queue مشخص ارسال میکند؛ با استفاده از پارامتر routeKey.
- پارامترهای بعدی، durable و autoDelete هستند که همانند پارامترهای QueueDeclare عمل میکنند.
public class ConsumerHostedService : BackgroundService { private readonly IConsumerService _consumerService; public ConsumerHostedService(IConsumerService consumerService) { _consumerService = consumerService; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { await _consumerService.ReadMessgaes(); } }
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; set; } public void ConfigureServices(IServiceCollection services) { services.AddCommonService(Configuration); services.AddSingleton<IConsumerService, ConsumerService>(); services.AddHostedService<ConsumerHostedService>(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { } }
[Route("api/[controller]/[action]")] [ApiController] public class RabbitController : ControllerBase { private readonly IRabbitMqService _rabbitMqService; public HomeController(IRabbitMqService rabbitMqService) { _rabbitMqService = rabbitMqService; } [HttpPost] public IActionResult SendMessage() { using var connection = _rabbitMqService.CreateChannel(); using var model = connection.CreateModel(); var body = Encoding.UTF8.GetBytes("Hi"); model.BasicPublish("UserExchange", string.Empty, basicProperties: null, body: body); return Ok(); } }
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; set; } public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddCommonService(Configuration); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapDefaultControllerRoute(); }); } }
{ "RabbitMqConfiguration": { "HostName": "localhost", "Username": "guest", "Password": "guest" } }
version: "3.2" services: rabbitmq: image: rabbitmq:3-management-alpine container_name: 'rabbitmq' ports: - 5672:5672 - 15672:15672
معرفی WPF UI
- Custom Project Template Not Found
- msvsmon.exe crashes when hitting breakpoint in native C++ code
- Search for a folder in solution explorer, then click home or the X in the search box. The view is reset.
- External Tools argument current line is always zero.
- Can't create v3 Function project.
- Access violation reading location 0xFFFFFFFFFFFFFFFF. after updating to VS 2019 Update 16.4.3
- Cannot create function app under 16.4
- MSVC2019 generates AVX-512 instruction in AVX/AVX2 mode
- Bad code generation with rsqrtss (register clobber)
- Visual Studio 2019 Debugger crashes when viewing FastLink callstack.
- C#: Fixed a crash when an attribute constructor is decorated with itself and Nullable Reference Types is enabled.
- Fixed an optimization-analysis bug where we lose track of alias information for arrays of indeterminate length (declared as extern int a[]) when we unroll loops, leading to possible incorrect dead-store removal.
تفاوت مجوز LGPL با GPL در چیست؟
A component licensed under LGPL can be used by closed source, proprietary software, both internally used and distributed, for free, with no effects on the software using the component. LGPL is not “contagious” in the same way as GPL, so it only affects the component under LGPL. As long as you’re only using official distributions of the component, it is free to use and free to redistribute. The only requirement is that you include a notice in your “about” page or similar that the component is used.