1

ASP.NET MVC アプリケーションを開発しており、Web API を使用してビジネス機能を処理したいと考えています。さらに、Dynamics AX および Dynamics CRM 製品との統合も行っています。したがって、本質的には、次のコンポーネントを開発することを考えていました。

  1. AX と (SOAP を介して) 通信し、データ転送オブジェクトを返す RESTFul サービスを構築します。
  2. CRM と (再び SOAP を介して) 通信する RESTFul サービスを構築し、データ転送オブジェクトを返す。

ここで私の質問は、たとえば注文画面 (AX と CRM からのデータが必要) にデータをロードすることです。

a. Use the controller to make calls to the RESTFUL Services and then use a Model object to pass the data to the screen.  
(or)
b. Do nothing in the controller, but use AJAX calls from the Razor to get data from the RESTFul services and load data into the screen.

(MVC および RESTFUL サービスを使用したこのようなシナリオでの設計に関して) 採用するベストプラクティスに誰かが光を当てることができれば幸いです。

4

1 に答える 1

1

外部の RESTful サービスを呼び出す場合は、POST または GET を介して HTTP リクエストを作成し、リクエストによって返されたレスポンスを適切に処理する必要があります。返されたデータが XML の場合、XML ドキュメント パーサーを使用して XML を使用する必要があります。返されたデータが JSON の場合、次のように動的解析を使用できます: JSON を C# 動的オブジェクトに逆シリアル化しますか? これは、JavaScript で JSON オブジェクトにアクセスする方法と同様のメカニズムを提供するため、JSON を処理するための非常に優れた方法です。

Web API で使用するコードを次に示します。

public class Base
{
    public string Username { get; set; }
    public string Password { get; set; }
    public string UserAgent { get; set; }
    public string ContentType { get; set; }
    public CookieCollection Cookies { get; set; }
    public CookieContainer Container { get; set; }

    public Base()
    {
        UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0";
        ContentType = "application/x-www-form-urlencoded";
        Cookies = new CookieCollection();
        Container = new CookieContainer();
    }

    public Base(string username, string password)
    {
        Username = username;
        Password = password;
        UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0";
        ContentType = "application/x-www-form-urlencoded";
        Cookies = new CookieCollection();
        Container = new CookieContainer();
    }

    public string Load(string uri, string postData = "", NetworkCredential creds = null, int timeout = 60000, string host = "", string referer = "", string requestedwith = "")
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
        request.CookieContainer = Container;
        request.CookieContainer.Add(Cookies);        
        request.UserAgent = UserAgent;
        request.AllowWriteStreamBuffering = true;
        request.ProtocolVersion = HttpVersion.Version11;
        request.AllowAutoRedirect = true;
        request.ContentType = ContentType;
        request.PreAuthenticate = true;

        if (requestedwith.Length > 0)
            request.Headers["X-Requested-With"] = requestedwith; // used for simulating AJAX requests

        if (host.Length > 0)
            request.Host = host;

        if (referer.Length > 0)
            request.Referer = referer;

        if (timeout > 0)
            request.Timeout = timeout;

        if (creds != null)
            request.Credentials = creds;

        if (postData.Length > 0)
        {
            request.Method = "POST";
            ASCIIEncoding encoding = new ASCIIEncoding();
            byte[] data = encoding.GetBytes(postData);
            request.ContentLength = data.Length;
            Stream newStream = request.GetRequestStream(); //open connection
            newStream.Write(data, 0, data.Length); // Send the data.
            newStream.Close();
        }
        else
            request.Method = "GET";

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Cookies = response.Cookies;
        StringBuilder page;
        using (StreamReader sr = new StreamReader(response.GetResponseStream()))
        {
            page = new StringBuilder(sr.ReadToEnd());
            page = page.Replace("\r\n", ""); // strip all new lines and tabs
            page = page.Replace("\r", ""); // strip all new lines and tabs
            page = page.Replace("\n", ""); // strip all new lines and tabs
            page = page.Replace("\t", ""); // strip all new lines and tabs
        }

        string str = page.ToString();
        str = Regex.Replace(str, @">\s+<", "><"); // remove all space in between tags

        return str;
    }
}

Xbox Live、PSN、Steam のデータを操作するための API に取り組んでいます。各サービスには独自の構造があり、これが各サービスに使用する基本クラスです。ただし、ここでは、これらの各サービスからデータを取得する方法について詳しく説明するつもりはありません。

于 2013-04-10T17:50:19.177 に答える