2013-04-10 2 views
1

Мы разрабатываем приложение ASP.NET MVC и хотим использовать веб-API для обработки бизнес-функций. Кроме того, мы также имеем интеграцию с продуктами Dyanmics AX и Dynamics CRM. Так, в сущности, я думал развивать следующие компоненты:Архивирование приложения MVC с помощью служб RESTul

  1. Чтобы построить RESTful службы, которая взаимодействует с AX (через SOAP) и вернуть передачи данных объекта.
  2. Для создания службы RESTFul, которая связывается с CRM (снова через SOAP) и возвращает данные Transfer Object.

Теперь мой вопрос, например, для загрузки данных в экране заказа (которые необходимы данные из 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 services)?

Спасибо.

+0

У вас есть пример кода для того, что вы пробовали? –

ответ

1

Если вы вызываете внешние службы RESTful, вам нужно будет создавать HTTP-запросы через POST или GET и обрабатывать ответ, возвращаемый запросами соответствующим образом. Если возвращаемые данные являются XML, вам нужно будет использовать XML, используя XML-парсер XML. Если возвращаемые данные являются JSON, вы можете использовать динамический синтаксический анализ, как показано здесь: Deserialize JSON into C# dynamic object? Это очень хороший способ справиться с JSON, поскольку он предоставляет механизм, аналогичный тому, как вы будете обращаться к объекту JSON в JavaScript.

Вот код, который я использую с моей веб-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; 
    } 
} 

Я работаю на API для взаимодействия с Xbox Live, PSN и данных Steam. Каждый сервис имеет свою структуру, и это базовый класс, который я использую для каждой службы. Однако я не буду подробно разбираться в том, как получать данные от каждой из этих услуг.

+0

Спасибо и подтвердите свое понимание. Вышеприведенный код может использоваться с контроллера для совершения HTTP-вызовов в WEB API Services .., который, я думаю, в порядке и не нарушает никаких принципов MVC. Опять просто проверяете, правильно ли он подходит? – user1421803

+1

Это хороший подход при вызове внешних служб. Этот метод не нарушает MVC. Вы можете добавить столько вспомогательных классов для своего контроллера, сколько вам нужно. Я использую этот код с несколькими услугами в моем RESTful API, который я разрабатываю. –

+1

Отлично. Спасибо и оцените свое время. – user1421803

Смежные вопросы