Thứ Sáu, 21 tháng 10, 2016

Enabling CORS in IISExpress

I was playing around with swagger-ui and was trying to point it to a local endpoint that I started with IIS Express. I was getting an error saying that it needed the endpoint to accept Access-Control-Allow-Origin requests.
I went Googling and it couldn't find anything specific to IIS Express but managed to use some guidance for full blown IIS.
The solution is to go to C:\Program Files (x86)\IIS Express\AppServer and open the applicationhost.configfile.
Search for httpProtocol and you should see this:
<httpProtocol>
    <customHeaders>
        <clear />
        <add name="X-Powered-By" value="ASP.NET" />
    </customHeaders>
    <redirectHeaders>
        <clear />
    </redirectHeaders>
</httpProtocol>
Now add this to the customHeaders node:
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
Just bear in mind this opens up your webserver so you may need to find something alternative for a live production environment.
Anyway you should now be able to start accepting requests via CORS when you fire up IISExpress

Enabling CORS in IISExpress

I was playing around with swagger-ui and was trying to point it to a local endpoint that I started with IIS Express. I was getting an error saying that it needed the endpoint to accept Access-Control-Allow-Origin requests.
I went Googling and it couldn't find anything specific to IIS Express but managed to use some guidance for full blown IIS.
The solution is to go to C:\Program Files (x86)\IIS Express\AppServer and open the applicationhost.configfile.
Search for httpProtocol and you should see this:
<httpProtocol>
    <customHeaders>
        <clear />
        <add name="X-Powered-By" value="ASP.NET" />
    </customHeaders>
    <redirectHeaders>
        <clear />
    </redirectHeaders>
</httpProtocol>
Now add this to the customHeaders node:
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
Just bear in mind this opens up your webserver so you may need to find something alternative for a live production environment.
Anyway you should now be able to start accepting requests via CORS when you fire up IISExpress

Thứ Ba, 30 tháng 8, 2016

How can I get and show the fields that are part of a table relation?

I assume you are trying to see the fields that make up the specified relation.
In order to do this, you use the DictRelation and DictField classes. Create a new DictRelation based on the table, and then use loadTableRelation() to specify the related table. Create new DictFields and use the DictRelation.lineExternTableValue() method to specify the specific fields:
DictRelation dr;
DictField   Field; 
DictField   RelatedField;
int         RelationIndex = 1;

dr = new DictRelation(tableNum(InventDim));
dr.loadTableRelation(tableNum(EcoResColor));
info(strFmt("%1", tableId2name(dr.externTable())));

Field = new DictField(tableNum(InventDim), dr.lineTableValue(RelationIndex));
RelatedField = new DictField(tableNum(EcoResColor), dr.lineExternTableValue(RelationIndex));

info(strFmt("%1 related to %2", Field.name(), RelatedField.name()));

Find related field in Dynamics AX

The following job helps you find the related field of a table, in the e,g it tries to find the related field of (InventTrans, InventTransId) for the sales Line table

static void FindRelateField(Args _args)
{
    SysDictTable    dictTable = new SysDictTable(tableNum(SalesTable));
    int             i,j;
    SysDictRelation dictRelation;
    TableId         externId = tableNum(PurchTable);
    IndexId         indexId;

    //Searh the explicit relations
    for(i=1; i <= dictTable.relationCnt(); i++)
    {
        dictRelation = new SysDictRelation(dictTable.id());
        dictRelation.loadNameRelation(dictTable.relation(i));

        // If it is a 'relation' then you use externTable(), but for extended data types you use table() (see next blook)
        if(SysDictRelation::externId(dictRelation) == externId)
        {
            for(j=1; j <= dictRelation.lines(); j++)
            {
                info(strFmt("%1", dictRelation.lineExternTableValue(j)));
                info(fieldId2name(dictRelation.externTable(), dictRelation.lineExternTableValue(j)));
            }
        }
    }

    info(strFmt("%1", dictRelation.loadFieldRelation(fieldNum(SalesLine,InventTransId))));
}

Thứ Ba, 23 tháng 8, 2016

Connect from one one AOS to another AOS via X++ and execute commands

I had a requirement to connect from one Axapta instance to another instance staying in MORPHX IDE. I have done this lot many times using Visual Studio in my past, but never tried with MORPHX IDE.

So, here are the steps:

Step1

Go to AOT > References > Add Reference to Microsoft.Dynamics.BusinessConnectorNet.dll (this file is usually located in Client folder, default path if you choose C it would be C:\Program Files\Microsoft Dynamics AX\50\Client\Bin)


Step 2

This piece of code shows how to connect to a remote AOS (Application), Here I'm just executing a class and retreiving the customer name. The LogonAs method used below is used to connect via the business connector proxy account as shown below. Otherwise the code is pretty straight forward



Troubleshooting/Error

I ran into this error (Screenshot shown below), Later I realised that on the remote AOS where I was connecting to the business proxy information was not set in Administration > Security > System Accounts form.

Thứ Hai, 22 tháng 8, 2016

C# Interfaces, what are they and why use them?

What is an Interface
First and foremost, interfaces in C# are a means to get around the lack of multiple inheritance in C#, meaning you cannot inherit from multiple classes but you can implement multiple interfaces. OOP tries to resemble how objects are defined in the real life, and interfaces are a very logical way of grouping objects in terms of behavior.
An interface is a contract between itself and any class that implements it. This contract states that any class that implements the interface will implement the interface's properties, methods and/or events. An interface contains no implementation, only the signatures of the functionality the interface provides. An interface can contain signatures of methods, properties, indexers & events.
You can think of an interface as an abstract class with the implementation stripped out. An interface doesn't actually do anything, like a class or abstract class, it merely defines what a class that implements it will do. An interface can also inherit/implement other interfaces.
Why use interfaces
So if an interface implements no functionality then why should we use them? Using interface based design concept provides loose coupling, component-based programming, easier maintainability, makes your code base more scalable and makes code reuse much more accessible because implementation is separated from the interface. Interfaces add a plug and play like architecture into your applications. Interfaces help define a contract (agreement or blueprint, however you chose to define it), between your application and other objects. This indicates what sort of methods, properties and events are exposed by an object.
For example let's take a vehicle. All vehicles have similar items, but are different enough that we could design an interface that holds all the common items of a vehicle. Some vehicles have 2 wheels, some have 4 wheels and can even have 1 wheel, though these are differences they have something in common, they're all movable, they all have some sort of engine, they all have doors, but each of these items may vary. So we can create an interface of a vehicle that has these properties, then we inherit from that interface to implement it.
While wheels, doors and engines are different they all rely on the same interface (I sure hope this is making sense). Interfaces allow us to create nice layouts for what a class is going to implement. Because of the guarantee the interface gives us, when many components use the same interface it allows us to easily interchange one component for another which is using the same interface. Dynamic programs begin to form easily from this. An interface is a contract that defines the signature of some piece of functionality.
So here's a simple example of an interface and implementing it. From the above example we're created a IVehicle interface that looks like this
namespace InterfaceExample
{    
    public interface IVehicle    
    {        
          int Doors { get; set; } 
          int Wheels { get; set; }
          Color VehicleColor { get; set; }
          int TopSpeed { get; set; }
          int Cylinders { get; set; } 
          int CurrentSpeed { get; } 
          string DisplayTopSpeed();
         void Accelerate(int step);    
    }
}
Now we have our vehicle blueprint, and all classes that implement it must implement the items in our interface, whether it be a motorcycle, car, or truck class we know that all will contain the same functionality. Now for a sample implementation, in this example we'll create a motorcycle class that implements our IVehicle class. This class will contains everything we have defined in our interface

namespace InterfaceExample
{    
     public class Motorcycle : IVehicle    
     {        
              private int _currentSpeed = 0;        
              public int Doors { get; set; }        
              public int Wheels { get; set; }        
              public Color VehicleColor { get; set; }        
              public int TopSpeed { get; set; }        
              public int HorsePower { get; set; }        
              public int Cylinders { get; set; } 
       
              public int CurrentSpeed        
              {            
                 get { return _currentSpeed; }        
              }


              public Motorcycle(int doors, int wheels, Color color, int topSpeed, 
                int horsePower, int cylinders, int currentSpeed)
              {
                  this.Doors = doors;            
                  this.Wheels = wheels;            
                  this.VehicleColor = color;            
                  this.TopSpeed = topSpeed;            
                  this.HorsePower = horsePower;            
                  this.Cylinders = cylinders;            
                  this._currentSpeed = currentSpeed;        
              }     
   
              public string DisplayTopSpeed()        
              {
                  return "Top speed is: " + this.TopSpeed;        
              }        

              public void Accelerate(int step)
              {            
                   this._currentSpeed += step;        
              }    
       }
}
Now in the same application we could interchange our Motorcycle class with a Truck class or a Car class and they will all have the same base functionality, that of a IVehicle.
So as you can see interface based development can make a developers life much easier, and our applications much cleaner, maintainable and extensible.

SQL SERVER – Find Stored Procedure Related to Table in Database – Search in All Stored Procedure

Following code will help to find all the Stored Procedures (SP) which are related to one or more specific tables. sp_help and sp_depends does not always return accurate results.
----Option 1
SELECT DISTINCT so.nameFROM syscomments scINNER JOIN sysobjects so ONsc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'
----Option 2
SELECT DISTINCT o.nameo.xtypeFROM syscomments cINNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'

Chủ Nhật, 1 tháng 5, 2016

Difference between WCF and Web API and WCF REST and Web Service

Web Service

  1. It is based on SOAP and return data in XML form.
  2. It support only HTTP protocol.
  3. It is not open source but can be consumed by any client that understands xml.
  4. It can be hosted only on IIS.

WCF

  1. It is also based on SOAP and return data in XML form.
  2. It is the evolution of the web service(ASMX) and support various protocols like TCP, HTTP, HTTPS, Named Pipes, MSMQ.
  3. The main issue with WCF is, its tedious and extensive configuration.
  4. It is not open source but can be consumed by any client that understands xml.
  5. It can be hosted with in the applicaion or on IIS or using window service.

WCF Rest

  1. To use WCF as WCF Rest service you have to enable webHttpBindings.
  2. It support HTTP GET and POST verbs by [WebGet] and [WebInvoke] attributes respectively.
  3. To enable other HTTP verbs you have to do some configuration in IIS to accept request of that particular verb on .svc files
  4. Passing data through parameters using a WebGet needs configuration. The UriTemplate must be specified
  5. It support XML, JSON and ATOM data format.

Web API

  1. This is the new framework for building HTTP services with easy and simple way.
  2. Web API is open source an ideal platform for building REST-ful services over the .NET Framework.
  3. Unlike WCF Rest service, it use the full featues of HTTP (like URIs, request/response headers, caching, versioning, various content formats)
  4. It also supports the MVC features such as routing, controllers, action results, filter, model binders, IOC container or dependency injection, unit testing that makes it more simple and robust.
  5. It can be hosted with in the application or on IIS.
  6. It is light weight architecture and good for devices which have limited bandwidth like smart phones.
  7. Responses are formatted by Web API’s MediaTypeFormatter into JSON, XML or whatever format you want to add as a MediaTypeFormatter.

To whom choose between WCF or WEB API

  1. Choose WCF when you want to create a service that should support special scenarios such as one way messaging, message queues, duplex communication etc.
  2. Choose WCF when you want to create a service that can use fast transport channels when available, such as TCP, Named Pipes, or maybe even UDP (in WCF 4.5), and you also want to support HTTP when all other transport channels are unavailable.
  3. Choose Web API when you want to create a resource-oriented services over HTTP that can use the full features of HTTP (like URIs, request/response headers, caching, versioning, various content formats).
  4. Choose Web API when you want to expose your service to a broad range of clients including browsers, mobiles, iphone and tablets.

Thứ Năm, 25 tháng 2, 2016

Triển khai Webserver trên Windows Server 2012: Phần 03

Cấu hình website
Từ giao diện Server Manager -> Chọn Tools -> Click Internet Information services (IIS) Manager.
sm.png

Hình 1: Giao diện quản lý Server Manager

web2

Hình 2: Giao diện quản lý Internet Information services (IIS) Manager.
  • Từ trình duyệt truy cập kiểm tra gõ: http://localhost/
web3
Hình 3: Kiểm tra kết quả sau khi cài IIS WebServer
Bước kế tiếp: vào máy DC_SRV2012 tạo cơ sở dữ liệu (Database) trước khi cấu hình Website: Từ Desktop Vào Start -> Apps search gõ: SQL Server Management Studio.
web6
Hình 4: Giao diện đăng nhập hệ thống SQL Server
- Đăng nhập quyền Authentication: SQL Server authentication, login: sa, password: (mật khẩu lúc cài đặt SQL).

Bước tiếp theo tiến hành xây dựng Website .aspx (source Code ASPX + Database MS SQL Server).
- Vào SQL Server Management studio -> Object Explorer -> Click Right chuột chọn Restore Database (hoặcAttach file đối với file .MDF, LDF).
sql
Hình 5: Giao diện Restore Database (hoặc Attach file) SQL Server
  • Bước tiếp theo: (1) Click From device -> (2) chọn file .bak -> (3) check -> (4) sổ xuống tìm tên Database- > Ok.
sql1
Hình 6: Giao Diện Restore Database Sql Server
web9.png
Hình 7: Thông báo restore thành công
Bước kế tiếp: Tạo mới trang web trên máy chủ Webserver 1: 
+ Source code web ASPX.
   + Cơ sở dữ liệu SQL.
  • Bước 1: Tạo 1 website mới, mở IIS Manager -> Right click Sites -> Add Website
web10
Hình 8: Giao diện tạo một website mới
Bước 2: Tab Add Website: Physical path tìm đường dẫn source web, Site name: Gõ tên web -> Click Select -> Host name: www.ntbh.no-ip.org bấm OK.
web11.png
Hình 9: Cửa sổ cấu hình môt website mới
Bước 3: Từ giao diện IIS Manager click chọn Application Pool -> Advanced Settings. Enable 32-Bit Applications: Chọn True -> Bấm OK.
web12.png
Hình 10: Cửa sổ tuỳ chỉnh cho phép ứng dụng 32 bit
  • Chọn WebBanDIENTHOAI: Click Default Document -> trỏ Default.aspx lên trên đầu dòng.
  • Chọn WebBanDIENTHOAI: Click Directory Browsing -> tab ActionEnable lên.
  • Chọn WebBanDIENTHOAI: Click Connection Settings, tinh chỉnh chuỗi kết nối cho phù hợp với trang web của mình. Trỏ chuỗi kết nối đến máy chủ DC_SRV2012 (SQL Server).
sql2
Hình 11: Giao diện kết nối Database.
Chú ý: Nếu không vào được SQL server, vào Services -> SQL Server (SQLEXPRESS) và SQL Server Browser ->Start (khởi động lại dịch vụ).
Kết quả kiểm tra thành công từ trình duyệt.
web
Hình 12: Giao diện trang web 1 www.ntbh.no-ip.org
Tạo Website trên Webserver 02: quá trình tương tự như trên webserver 01.

Triển khai Webserver trên Windows Server 2012 – Phần 02

Các bước chính cấu hình DNS Server trên Windows Server 2012
  • Tạo Zone thuận Forward Lookup Zones: Tạo Host New Host (A or AAAA)… cho virtual IP cluster: 192.168.4.99.
  • Tạo Zone ngược Reverse Lookup Zones: 192.168.4.0 /24.
Chi tiết các bước cấu hình dịch vụ DNS Server localhost:
Tạo Zone thuận Forward Lookup Zones: ntbh.no-ip.org (Tên phân giải ra IP)
  • Bước 1: Từ giao diện Server Manager -> Chọn Tools -> Chọn DNS.
  • Bước 2: Chuột phải vào Forward Lookup Zones, chọn New Zone
  • Bước 3:Tại màn hình “Welcome to the New Zone Wizard”, chọn Next
  • Bước 4: Tại màn hình “Zone Type”, chọn Primary zone, chọn Next
  • Bước 5: Tại màn hình “Zone Name”, nhập tên domain vào đây, chọn Next
newzone
  • Bước 6: Tại màn hình “Zone File”, chọn Next
  • Bước 7: Tại màn hình “Dynamic Update”, chọn “Allow both nonsecure and secure dynamic updates”, chọnNext
Dynamicupdate
Bước 8: Tại màn hình “Completing the New Zone Winzard”, chọn Finish.
Tạo bản ghi phân giải (như hình sau)
DNS manager
Bước 1: Tại DNS Server Manager -> Click chuột phải vào zone ntbh.com vừa tạo, chọn New Host (A or AAAA)
host
  • Bước 2: Tạo bản ghi www
www
Tạo Zone ngược Reverse Lookup Zones (IP phân giải ra tên)
  • Bước 1: Tại màn hình “Welcome to the New Zone Wizard”, chọn Next
  • Bước 2: Tại màn hình “Zone Type” chọn Primary Zone, chọn Next
  • Bước 3: Tại màn hình “Reverse Lookup Zone Name” chọn IPv4 Reverse Lookup Zone, chọn Next
  • Bước 4: Tại màn hình “Reverse Lookup Zone Name”, nhập dải IP, chọn Next
RLZ
·        Bước 5: Tại màn hình “Zone File” chọn Next
·        Bước 6: Tại màn hình “Dynamic Update”, lựa chọn “Allow both nosecure and secure dynamic updates”, chọn Next
zone RLZ
  • Bước 7: Tại màn hình “Completing the New Zone Wizard”, chọn Finish.
Tạo bản ghi New Pointer (PTR)…
ptr
  • Vào Run-> CMD: gõ lệnh nslookup kiểm tra phân giải bản ghi
nslookup

Triển khai Webserver trên Windows Server 2012: Phần 01

I. Mô hình triển khai:

Hình 1.1: Mô hình triển khai WebServer cho doanh nghiệp
II. Chuẩn bị:
Mô hình thực hiện được làm trên 3 máy chủ khác nhau:
-2 máy làm máy chủ Webserver: Webserver 1, Webserver 2
-1 máy chủ DNS làm phân giải, ánh xạ địa chỉ IP cho 2 máy Webserver 1 ,
-Webserver 2 và giữ vai trò là máy Database cho cả 2 Web.
-Cài đặt Network Load Balancing trên Webserver 1, Webserver 2
-Cấu hình Network Load Balancing Webserver 1.
-Cấu hình public cho 1 trang Web ra được mạng thông qua Router và đăng kí Tên miền tại trang web http://www.noip.com/ làm tên miền ra internet. Ở đây đã đăng kí với tên tên miền: ntbh.no-ip.org.
-Triển khai Webserver hỗ trợ ngôn ngữ PHP.
-Cấu hình FTP Website từ xa.
-Cấu hình SQL Server 2008 r2 management studio từ xa.
Triển khai trên máy DC_SRV2012:
+ Cấu hình dịch vụ DNS Server.
+ Cài đặt hệ quản trị cơ sở dữ liệu SQL Server 2008 r2.
Triển khai trên máy Webserver 1:
+ Cài đặt Internet Information Services IIS.
Tạo 1 trang web trên máy chủ Webserver 1.
+ Cài đặt và cấu hình Network Load Balancing.
+ Mở port 80: Windows Firewall with Advanced Security.
Triển khai trên máy Webserver 2:
+ Cài đặt Internet Information Services IIS.
Tạo 1 trang web trên máy chủ Webserver 2.
+ Cài đặt Network Load Balancing.
+ Mở port 80: Windows Firewall with Advanced Security.
II. Thực hiện: Cấu hình Load Balancing trên WebServer 1 và WebServer 2
 Để đáp ứng yêu cầu máy chủ Webserver hoạt động 24/24, đảm bảo Website luôn truy cập mọi lúc mọi thời điểm. ta sẽ tiến hành triển khai Network Load Balancing (NLB) cho WebServer 1 và WebServer 2.
Cài đặt Network Load Balancing trên máy Webserver 1
  • Từ giao diện Server Manager 
sm
Hình 1.2: Giao diện quản lý Server Manager
Bước kế tiếp: Click chọn Add roles and features -> next…-> Select Features.
nlb1
Hình 1.3: Giao diện để vào cài đặt network load balancing
=> Click chọn network load balancing => install => Close.  => Restart lại máy.
Cài đặt Network Load Balancing trên máy Webserver 2 (tương tự như Webserver 1).

Triển khai cấu hình trên máy Webserver 1.
nlb1
Hình 1.4: Giao diện newtwork Load Balancing Manager
  • Từ giao diện Server Manager -> Chọn Tools -> click chọn Network Load Balancing -> Right click chọn -> new Cluster.
nlb2
Hình 1.5: Tạo một địa chỉ ip cluster
  • Host: nhập 192.168.4.90 (IP Webserver 1) -> Connect.
nlb3.png
Hình 1.6: Nhập địa chỉ IP Webserver 1 để kết nối
Next -> next -> Add IPv4 address192.168.4.99 (Virtual IP) SM: 255.255.255.0.
nlb4.png
Hình 1.7: Tạo 1 đia chỉ ip cluster
Ok -> next. Full internet name: gõ www.ntbh.np-ip.org Click chọn Muticast.
nlb5
Hình 1.8: Nhập DNS Name clucster parameters
  • Tiếp theo Port Rules -> click Edit -> port Range
+ From: 80
+ To: 80
+ Filtering mode: None ->Finish.
nlb6.png
Hình 1.9: Cửa sổ sửa lại port range 80
Giao diện Network Load Balancing -> www.ntbh.no-ip.org(192.168.4.99) -> Right Click Chọn Add Host To Cluster -> Host: 192.168.4.91 (IP Webserver 2) -> next -> Finish.
nlb6
Hình 1.10: Tạo 1 host cluster IP Webserver 2
Quá trình Add host Cluster thành công:
nlb7
Hình 1.11: Giao diện thêm host cluster IP www.ntbh.no-ip.org(192.168.4.99)

Thứ Bảy, 30 tháng 1, 2016