Практика проектирования REST API для существующего сайта .NET C # - PullRequest
0 голосов
/ 26 июля 2011

Я бы хотел, чтобы наш пользователь высаживал веб-сервер POST XML на наш вычислительный веб-сервер (для обработки данных XML).Посадочные и вычислительные веб-серверы подключаются только через Интернет - поэтому лучше всего иметь REST API на вычислительном веб-сервере, чтобы XML-данные могли POSTed для обработки.

Если честно, мы все инженеры SW, но наша компетенция в алгоритмической обработке, а не в веб-сантехнике или в ASP.NET.Я огляделся и увидел, что WCF (Windows Communication Foundation) довольно много пинается.Я обеспокоен тем, что WCF может быть слишком сложным / слишком сложным для нашей ситуации.

Итак, как мне проще всего сделать так, чтобы существующий веб-сайт обработки на основе веб-форм принимал POSTed XML?Я предполагаю, что мне нужно зарегистрировать URI (в web.config?) В качестве интерфейса API, иметь обработчик этого URI и получить строку XML - я просто не знаю шагов реализации :(. Так что игрушечный пример илиуказатель на учебник был бы офигенным!

Кстати, как только я получу строку XML на сервере обработки, я золотая!

Спасибо, Сид

Ответы [ 2 ]

0 голосов
/ 03 августа 2011

Хорошо, я прочитал несколько документов, чтобы ответить на свой вопрос.В основном, WCF REST сильно изменился.В предыдущих версиях это довольно сложно настроить, но в последних версиях (начальный комплект .NET 4 и WCF REST) ​​издержки на конфигурацию намного меньше.

Чтобы быстро запустить WCF REST, я в основном сделал 3 вещи,

  1. Настройка пути к службе в global.asax.cs (мне пришлось вручную добавить / отредактировать его как global.asax и global.asax.cs)
  2. Настройка "контракт на обслуживание "(т. е." doThisMethod "внутри http://localhost/doThisMethod/)
  3. Настройка" контракта данных "(т. е. если вы размещаете любой XML / JSON через тело HTTP, это" сопоставляет "/ сериализуетмежду XML / JSON и собственными объектами C #.)

Для базовых API REST (т. е. только HTTP GET) достаточно только первых двух шагов.Пожалуйста, обратите внимание, я удалил некоторые вещи во время вставки копий, но вы должны понять ...

Step1a

global.asax

<%@ Application Codebehind="~/App_Code/Global.asax.cs" Inherits="MyBLL.Global" Language="C#" %>

Step1b

global.asax.cs

using System;
using System.Collections.Generic;
using System.ServiceModel.Activation;
using System.Web;
using System.Web.Routing;

public class Global : System.Web.HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup
        RouteTable.Routes.Add(new ServiceRoute("/", new WebServiceHostFactory(), typeof(TestService)));
    }
}

Step2a

Как видите, я разделюинтерфейс (абстрактный класс) и фактическая реализация в два отдельных файла для чистого разделения.

TestInterface.cs

using System;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;

[ServiceContract]
interface TestInterface
{
    [OperationContract]
    string TestAsXML(string extra);

    [OperationContract]
    string TestAsJSON(string extra);
}

Step2b TestService.cs

using System;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class TestService : TestInterface

    [WebInvoke(UriTemplate = "Test/{username}", Method = "GET", ResponseFormat = WebMessageFormat.Xml)]
    public string TestAsXML(string username)
    {
        WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
        return String.Format("Hello {0}!", String.IsNullOrWhiteSpace(username) ? "world" : username);
    }

    [WebInvoke(UriTemplate = "Test/{username}?format=json", Method = "GET", ResponseFormat = WebMessageFormat.Json)]
    public string TestAsJSON(string username)
    {
        // NOTE, if we GET this from a browsers, it will most likely have 
        // "Accept: text/html, application/xhtml+xml, */*" in the HTTP header
        // So the framework will return XML instead. Try from Fiddler2 instead or
        // write your own WCF client or from AJAX
        WebOperationContext.Current.OutgoingResponse.ContentType = "application/json";
        return String.Format("Hello {0}!", String.IsNullOrWhiteSpace(username) ? "world" : username);
    }

Step3

В вышеприведенном примере "test" все находится над самим URI (из-за GET), поэтому вам не нужны указанные ниже данные.Практически, если вы хотите использовать POST и т. Д., Вам нужно отправить объект в теле HTTP.При обмене данными используйте «Контракт данных», чтобы использовать функции WCF, как показано ниже.

Здесь я буду отправлять один класс в теле HTTP, который, в свою очередь, имеет одну строку и один int внутри.

TestInput.cs

using System;
using System.Web;
using System.Runtime.Serialization;

// "" needed to clear out ugly xmlns namespace tags to make it plain old XML (POX)
// If you want them, ether take it out or specify on your own
[DataContract(Name = "TestInput", Namespace = "")] 
public class TestInput
{
    // NOTE: If Order property is skipped, the data will be serialized 
    // alphabetically per variable names!!
    // This can kill services, so better to be explicit
    [DataMember(Order = 0)] 
    int SomeNumber;

    // NOTE: If Name property is used XML will have UserName instead of internalUserName
    [DataMember(Name="UserName", Order = 1)] 
    string internalUserName;       
}
0 голосов
/ 26 июля 2011

Если вы просто хотите получить самый тонкий из возможных слоев, не вмешиваясь в сантехнику или не разбираясь с wcf, создайте веб-проект asp.net, затем щелкните правой кнопкой мыши и добавьте элемент, выберите httphandler, и в случае, если он выдаст строку xml из ответа .items [строковый ключ]. опубликуйте его как URL-адрес ashx? key = вашу строку xml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...