Служба WCF REST JSON Почтовые данные

Ищите некоторые рекомендации по службе wcf 4 rest, которая основана на расширении WCF REST Template 40 (CS) в VS2010. Я провел последние пару дней, пытаясь заставить этого педераста работать, просматривая другие сообщения, и, пока я закрылся, я не могу пересечь финишную черту. После большого разочарования он, наконец, попадает на службу и проводку (используя построитель запросов на скрипач), но параметр метода встречается как null, но он правильно устанавливается в построителе запросов. Я предполагаю, что это может быть проблема с конфигурацией на данный момент, но по мере того, как наступает срок, у меня заканчивается время для дополнительных исследований. FWIW, при отладке переменная jsonstring имеет значение null. Я, по общему признанию, являюсь вопросом noob, поскольку это первый раз через REST для меня, любая помощь была бы высоко оценена!

Спасибо заранее.

web.config

<system.web>
  '<compilation debug="true" targetFramework="4.0" />
</system.web>

<system.webServer>
 <modules runAllManagedModulesForAllRequests="true">
   <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
 </modules>
</system.webServer>

<system.serviceModel>
 <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
 <standardEndpoints>
   <webHttpEndpoint>
     <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"/>
   </webHttpEndpoint>
 </standardEndpoints>
</system.serviceModel>

Global.asax.cs

   public class Global : HttpApplication
  {
      void Application_Start(object sender, EventArgs e)
      {
         RegisterRoutes();
      }

      private void RegisterRoutes()
      {
         RouteTable.Routes.Add(new ServiceRoute("Scoring", new WebServiceHostFactory(), typeof(ScoringSvc)));
      }
   }

Код службы

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class ScoringSvc 
{
   [OperationContract]
   [WebInvoke
      (Method = "POST",
      BodyStyle = WebMessageBodyStyle.WrappedRequest,
      RequestFormat=WebMessageFormat.Json,
      ResponseFormat=WebMessageFormat.Json)]
   public string BOB(string jsonstring)
   {
      return "Received: " + jsonstring;
   }
}

Заголовок запроса Fiddler

Host: localhost
Content-Length: 20
Content-Type: application/json; charset=UTF-8

запрос тела

{"Name":"Frank"}

Сырой ответ от скрипача

HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 12
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 21 Mar 2011 21:31:14 GMT

"Received: "

Ответ 1

Наткнулся на эту ссылку WCF + REST: Где данные запроса? и увидели ответ Гленна, чтобы передать поток методу, а затем разорвать его с помощью средства очистки потока в строку, чтобы получить данные формы.

Изменен код службы прототипа следующим образом

[OperationContract]
[WebInvoke
   (UriTemplate="/BOB",
    Method = "POST",
    BodyStyle = WebMessageBodyStyle.WrappedRequest)]
public string BOB (Stream streamdata)
{
    StreamReader reader = new StreamReader(streamdata);
    string res = reader.ReadToEnd();
    reader.Close();
    reader.Dispose();
    return "Received: " + res;
}

И это, кажется, делает трюк, полный массив json передается в потоке, считывается в локальную строку, и я могу затем атаковать его с помощью json.net для сериализации в/из словаря, чтобы перейти к бизнес-логике, Не очень красиво, но функционально.

Ответ 2

Я использую этот и работает:

[WebInvoke(ResponseFormat = WebMessageFormat.Json, 
           RequestFormat = WebMessageFormat.Json,
           BodyStyle = WebMessageBodyStyle.WrappedRequest,
           Method = "POST",
           UriTemplate = "setExpositions?shelfId={shelfId}")]
[OperationContract]
public bool SetExpositions(int shelfId, List<WcfExposition> expositions)
{
}

где shelfId передается в GET, а презентации передаются в теле сообщения как данные JSON.

Ответ 3

Пробовали ли вы ввести { "jsonstring": "Frank" } в тело запроса (внутри конструктора запросов Fiddler)?

Ответ 4

Я думаю, что в BodyStyle = WebMessageBodyStyle.WrappedRequest может возникнуть проблема, которая будет - я думаю, хотя документация полностью неясна - ожидайте, что элемент будет обернут именем метода.

Установите этот развернутый текст и установите тело запроса на '{"Name":"Frank"}' (обратите внимание на одинарные кавычки вокруг него). На самом деле вы отправляете строку, содержащую JSON. Я понятия не имею, зачем вам это нужно. Это напоминает мне http://thedailywtf.com/Articles/XMLd-XML.aspx, где они помещают xml в свой xml. Вы помещаете JSON в свой JSON.