Showing posts with label C#. Show all posts
Showing posts with label C#. Show all posts

Monday, July 29, 2019

Call SOAP request from C#

byte[] byteArray = Encoding.UTF8.GetBytes(requestContent);
                HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(_urlTransaction);
                Request.Method = "POST";
                Request.ContentType = "text/xml;charset=utf-8";
                Request.ContentLength = byteArray.Length;
                Request.Accept = "application/xml";

                string XMLResponse = "Bytes to send: " + byteArray.Length;
                Stream streamRequest = Request.GetRequestStream();
                // Write the data to the stream.
                streamRequest.Write(byteArray, 0, byteArray.Length);

                streamRequest.Close();

                FCUBS_RES_ENV response = null;
                HttpWebResponse Response = (HttpWebResponse)Request.GetResponse();
               
                using (StreamReader reader = new StreamReader(Response.GetResponseStream()))
                {
                    var returnMessage = reader.ReadToEnd().XmlDeserializeFromString();
                    XMLResponse += Response.StatusCode + Response.StatusDescription + reader.ReadToEnd();

                    _log.Info($"Transaction return :transCode:{transcode}|Account:{nib}|Amount{amount}| responseMessage: {returnMessage.Body.CreateTransactionResponse.Text}");
                   
                    response = returnMessage.Body.CreateTransactionResponse.Text.XmlDeserializeFromString();
                }
                

Wednesday, December 12, 2018

Build web MVC on visual studio error Process with an ID #### is not running.

First Error

For the first error:
Process with an ID #### is not running.
The following steps worked for me:
  1. Close all instances of Visual Studio.
  2. Rename the IISExpress folder (in my PC is in C:\Users\jmelosegui\Documents).
  3. Add the _CSRUN_DISABLE_WORKAROUNDS Environment System variable with the value of 1.enter image description here
  4. Start Visual Studio in administrator mode. (In Windows, right click the executable file and select Run as administrator).

Second Error

The second error:
The webpage is not available
What caused this error:
I deleted IIS Express Development Certificate while playing with the SSL.
The following steps worked for me:
  1. Go to Control Panel.
  2. Select Add/Remove Programs.
  3. Locate IIS 8.0 Express.
  4. Right click on it then click Repair.
  5. Your certificate should be back!
Hope this helps!

Monday, May 28, 2018

Cursor in SQL server

DECLARE @idns VARCHAR(20), @message NVARCHAR(100);
 
DECLARE bts_cursor CURSOR FOR 
 SELECT ISDN FROM CDR.dbo.CDR WHERE BTS_ATT IS NULL ORDER BY CustomerID;

OPEN bts_cursor
FETCH NEXT FROM bts_cursor
INTO @idns
WHILE @@FETCH_STATUS = 0 
BEGIN 
 PRINT ' ' 
    SELECT @message = '----- IDNS: ' + @idns 
    PRINT @message 
 
   select *  FROM  OPENQUERY(CDR ,  'select sub_id,CUST_ID,isdn,sub_name,status,ACT_STATUS,STA_DATETIME,END_DATETIME,REG_TYPE,USER_CREATED,SHOP_CODE,SHOP_SALE,BIRTH_DATE,GENDER,VALID_DATETIME,
 CHANGE_DATETIME,PRODUCT_CODE,DISTRICT_ACTIVE,CENTRE_CODE,CENTRE_SALE,BTS,OWNER_TYPE,OWNER_CODE from report.sub_mb_pre where status = 2 and ACT_STATUS =00' and ISDN = @idns)
 -- Get the next item. 
    FETCH NEXT FROM bts_cursor 
    INTO @idns
END
CLOSE bts_cursor 
DEALLOCATE bts_cursor

Friday, April 27, 2018

Tự động thực thi tác vụ theo lịch trong ASP.NET với Quartz.NET

Một câu hỏi lặp đi lặp lại trên các diễn đàn ASP.NET thường là “Làm sao để tạo một task chạy theo lịch trong ứng dụng web?”. Ví dụ, yêu cầu là gửi mail hàng ngày sẽ chạy vào mỗi một giờ cố định trong ngày, nhưng thực tế sẽ có rất nhiều các công việc có thể cần được thực hiện khác. Theo đó, hàng tá các thành viên trên diễn đàn đưa ra các gợi ý như cài Windows Services hoặc chạy lệnh với Task Scheduler nhưng thực tế là hầu hết các chủ website  đều không có quyền chạy các services này vì họ chỉ mua hosting thôi.
Tôi đã tìm kiếm được một giải pháp như kiểu kích hoạt task đó chạy trong sự kiện Session_Start của file Global.asax trước đây. Tuy nhiên nó có vấn đề là việc chạy task phụ thuộc vào lượt truy cập của ứng dụng của bạn. Và tất nhiên nó sẽ không phù hợp với các task quan trọng cần thực thi đúng thời điểm. Một giải pháp rất hay ở đây được tìm thấy là sử dụng Quartz.NET, một thư viện đặt lịch chạy tác vụ mã nguồn mở có sẵn qua nuget. Bài viết này sẽ hướng dẫn cách triển khai cơ bản để bạn có thể chạy được một tác vụ gửi mail tự động. Mình chọn WebForm để demo cách sử dụng Quartz.NET, nhưng với MVC và Web Pages thì cũng tương tự như vậy.
Cách dễ nhất là cài đặt Quartz.NET qua Nuget. Bạn có thể cài qua câu lệnh Install-Package Quartz trong cửa sổ Package Manager Console bằng cách click chuột phải vào project trong Visual Studio cửa sổ Solution Explorer và chọn Manage Nuget Packages.
Quartz
Chú ý: Nếu sử dụng WebMatrix, chỉ cần click vào nút Nuget trong thanh ribbon và bỏ qua thông báo lỗi.
Sau đó tìm kiếm từ khóa ‘quartz’ và click nút Install khi bạn tìm thấy Quartz.NET
Quartz
Đơn giản nhất, Quartz bao gồm 3 thành phần chính là 1 job, 1 trigger và 1 scheduler. Một job là một tác vụ được thực hiện. Trigger chỉ ra cách thức và thời gian job được thực thi. Và cuối cùng job và trigger được đăng ký với scheduler, thành phần này sẽ đảm bảo rằng job được thực thi theo thời gian cấu hình trong trigger.
Một job là một class. Để làm việc với Quartz, nó phải được triển khai từ interface của Quartz là Ijob có một phương thức là Execute. Phương thức này định nghĩa các logic được thực thi. Đây là một ví dụ của job:
using Quartz;

using System;

using System.Net;

using System.Net.Mail;



namespace ScheduledTaskExample.ScheduledTasks

{

    public class EmailJob : IJob

    {

        public void Execute(IJobExecutionContext context)

        {

            using (var message = new MailMessage("user@gmail.com", "user@live.co.uk"))

            {

                message.Subject = "Test";

                message.Body = "Test at " + DateTime.Now;

                using (SmtpClient client = new SmtpClient

                {

                    EnableSsl = true,

                    Host = "smtp.gmail.com",

                    Port = 587,

                    Credentials = new NetworkCredential("user@gmail.com", "password")

                })

                {

                    client.Send(message);

                }

            }

        }

    }

}

Phương thức Execute cần một đối tượng của interface IJobExecutionContext như một tham số. Scheduler sẽ truyền nó trong khi gọi phương thức Execute của job. Nó chứa các thông tin cấu hình về job. Trong ví dụ cơ bản này, không dùng gì đến các dữ liệu này của context nhưng có thể một số job chúng ta sẽ cần dùng đến. Tất cả ví dụ này nhằm mục đích gửi một email. Thân của phương thức chứa bất cứ cái gì mà bạn muốn làm. Nó có thể là truy vấn database và gửi mail cho các khách hàng…
Phần tiếp theo là demo về scheduler sẽ cài đặt và job với trigger sẽ được tạo và gán:
using Quartz;

using Quartz.Impl;

using System;



namespace ScheduledTaskExample.ScheduledTasks

{

    public class JobScheduler

    {

        public static void Start()

        {

            IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();

            scheduler.Start();



            IJobDetail job = JobBuilder.Create().Build();



            ITrigger trigger = TriggerBuilder.Create()

                .WithDailyTimeIntervalSchedule

                  (s =>

                     s.WithIntervalInHours(24)

                    .OnEveryDay()

                    .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(0, 0))

                  )

                .Build();



            scheduler.ScheduleJob(job, trigger);

        }

    }

}

Tôi đã gọi class là JobScheduler, nhưng bạn có thể gọi bất cứ là gì. Trong thực tế, đoạn code không cần đặt trong class này mà đặt bất cứ đâu bạn muốn. Trong một ứng dụng web, nó sẽ là sự kiện Application_Start trong Global.asax. Trong ví dụ này, đoạn code thực tế sẽ đặt trong phương thức gọi là Start (Bạn có thể đặt tên là gì tùy thích). Một scheduler được tạo và khởi chạy trong 2 dòng. Sau đó một job được tạo sử dụng Quartz.NET trong phương thức JobBuilder.Create, trong đó T là kiểu của job được tạo. Trong trường hợp này, nó là thể hiện của EmailJob được định nghĩa ở trên.
Tiếp theo, một trigger được khởi tạo. Như tôi đã nhắc đến ở trên, trigger định nghĩa khi nào job được thực thi. Trong trường hợp này, scheduler được chỉ định chạy hàng ngày vào nửa đêm và sẽ chạy cứ mỗi 24 giờ. Nó thực thi hàng ngày và các tùy chọn thực thi có thể linh hoạt và cho phép đặt lịch theo thời gian thực. Đây là ví dụ khác về trigger.
ITrigger trigger = TriggerBuilder.Create()

    .WithIdentity("trigger1", "group1")

    .StartNow()

    .WithSimpleSchedule(x => x

        .WithIntervalInSeconds(10)

        .RepeatForever())

    .Build();

Trigger được đặt một cái tên và nhóm nó có thể dễ dàng định danh nếu bạn cần tham chiếu trong lập trình. Nó được thiets kế để chạy t rực tiếp sau mỗi 10 giây cho đến khi kết thúc (hoặc bị dừng vì lý do nào đó). Fluent API giúp cho việc tạo trigger dễ nhìn và dễ hiểu hơn.
Cuối cùng, job và trigger được đăng ký với scheduler. Tất cả những gì cần thiết đã sẵn sàng để thực thi. Như đã nhắc đến ở trên, nơi tốt nhất để làm điều này là sự kiện Application_Start trong Global.asax, để gọi phương thức JobScheduler.Startđược thêm vào bên cạnh các tác vụ khởi động khác:
using ScheduledTaskExample.ScheduledTasks;

using System;

using System.Web;

using System.Web.Optimization;

using System.Web.Routing;



namespace ScheduledTaskExample

{

    public class Global : HttpApplication

    {

        void Application_Start(object sender, EventArgs e)

        {

            // Code that runs on application startup

            RouteConfig.RegisterRoutes(RouteTable.Routes);

            BundleConfig.RegisterBundles(BundleTable.Bundles);

            JobScheduler.Start();

        }

    }

}

Nếu bạn cần chạy tác vụ theo lịch như một phần của ứng dụng ASP.NET với tính chính xác mà bạn lại không có quyền truy cập vào các hệ thống chạy tác vụ theo lịch trên server thì Quartz.NET là một giải pháp tuyệt vời.

Cách triển khai Memory Cache đơn giản cho Web API

Trong ASP.NET MVC Controller các bạn cũng là làm quen với Output Caching mà mình giới thiệu trong các khóa học ASP.NET MVC. Đó là một trong những cách triển khai caching đơn giản nhất cho ứng dụng ASP.NET MVC sử dụng thư viện sẵn có của nó.
Caching chính là việc giảm thiểu việc lấy dữ liệu liên tục từ nguồn khác đối với các dữ liệu hay truy cập và ít thay đổi. Các bạn nhớ là phải đảm bảo 2 tiêu chí là mức độ truy cập thường xuyên và dữ liệu ít thay đổi. Ví dụ: Danh mục sản phẩm, quyền người dùng, sản phẩm xem nhiều…Điều này làm tăng tốc độ tải trang do dữ liệu được cache sẵn trên bộ nhớ và tiết kiệm thời gian.
Thường trng ASP.NET Web API bạn sẽ cần phải cache một số thứ tạp thời trên bộ nhớ để tăng hiệu năng của chương trình.
Có một vài thư viện hữu ích giúp bạn làm điều đó. Một trong số đó rất phổ biến là CacheCow bạn có thể xem hướng dẫn tại đây. Nhưng nếu bạn muốn sử dụng caching mà không muốn dùng một thư viện của bên thứ 3 nào cả vậy thì làm sao để triển khai nhanh nhất.

Caching cho Web API không sử dụng third party

Tôi đã triển khai một vài lần việc chứng thực người dùng sử dụng ASP.NET Web API với token và muốn cache các token tạm thời trên bộ nhớ để tránh lúc nào cũng phải vào cơ sở dữ liệu để truy xuất ra cho mỗi một request gửi lên.
Cách làm rất đơn giản. Bạn chỉ cần sử dụng một Class được xây dựng sẵn gọi là MemoryCache nằm trong thư việnSystem.Runtime.Caching dll.
Trước khi sử dụng được class MemoryCache bạn cần Add Reference đến thư viện này:
Tôi đã tạo một class tiện ích cho việc caching:
public class MemoryCacheHelper
    {
        /// 
        /// Get cache value by key
        /// 
/// /// public static object GetValue(string key) { return MemoryCache.Default.Get(key); } /// /// Add a cache object with date expiration /// /// /// /// /// public static bool Add(string key, object value, DateTimeOffset absExpiration) { return MemoryCache.Default.Add(key, value, absExpiration); } /// /// Delete cache value from key /// /// public static void Delete(string key) { MemoryCache memoryCache = MemoryCache.Default; if (memoryCache.Contains(key)) { memoryCache.Remove(key); } } }
Và khi bạn muốn caching thứ gì đó, chỉ cần add nó vào cache với một cái key duy nhất và giá trị của cache:
            MemoryCacheHelper.Add("topProducts",new List<string>() { "A"}, DateTimeOffset.UtcNow.AddHours(1));
Và khi sử dụng chỉ cần get ra theo key đó:
 var topProducts = MemoryCacheHelper.GetValue("topProducts");
Chú ý: Bạn nên nhớ là MemoryCache sẽ được xóa mỗi khi IIS app pool được làm mới (recycle)
Nếu Web API của bạn :
  • Không nhận được bất cứ request nào trong vòng hơn 20 phút
  • Hoặc đặt thời gian mặc định cho IIS làm mới Pool là 1740 phút
  • Hoặc bạn deploy một bản build mới lên thư mục Web API được triển khai trên IIS
Thì bạn nên có một thao tác tay. Nếu bạn không lấy giá trị từ cache được thì bạn nên lấy nó từ database và sau đó gán lại vào cache:
var topProducts = MemoryCacheHelper.GetValue("topProducts");
            if (topProducts == null)
            {
                // for example get token from database and put grabbed token
                // again in memCacher Cache
                MemoryCacheHelper.Add("topProducts", new List<string>() { "A" }, DateTimeOffset.UtcNow.AddHours(1)));

            }

Friday, April 20, 2018

GET SiteName , ApplicationPoolName From IIS

You are looking for ServerManager (Microsoft.Web.Administration) which provides read and write access to the IIS 7.0 configuration system.

(FIND in Forlder : C:\Windows\System32\inetsrv )


// Snippet        
using (ServerManager serverManager = new ServerManager()) { 

var sites = serverManager.Sites; 
foreach (Site site in sites) { 
         Console.WriteLine(site.Name); // This will return the WebSite name
}
You can also use LINQ to query the ServerManager.Sites collection (see example below)
// Start all stopped WebSites using the power of Linq :)
var sites = (from site in serverManager.Sites 
            where site.State == ObjectState.Stopped 
            orderby site.Name 
            select site); 

        foreach (Site site in sites) { 
            site.Start(); 
        }
Note : Microsoft.Web.Administration works only with IIS7.
And  RUN VisualStudio  with RUN AS ADMINISTRATOR

===

Với  ApplicationPool

 using (ServerManager serverManager = new ServerManager())
            {
                var appPools = serverManager.ApplicationPools;

      foreach (ApplicationPool appPool in appPools)
                {
                    Console.WriteLine(appPool.Name)

                }

}