WCF REST Service JSON Опубликовать данные - PullRequest
11 голосов
/ 22 марта 2011

Требуется руководство по услуге отдыха wcf 4, основанное на расширении шаблона 40 (CS) REST WCF в VS2010. Я провел последние пару дней, пытаясь заставить этого пиджака работать, просматривая другие посты, и, хотя я приблизился, я не могу пересечь финишную черту. После большого разочарования, он, наконец, попадает в службу и публикует (используя построитель запросов fiddler), но параметр метода выглядит как нулевой, но он правильно устанавливается в построителе запросов. Я предполагаю, что это может быть проблема конфигурации в этот момент, но по мере приближения крайнего срока у меня заканчивается время для дополнительных исследований. FWIW, при отладке переменная jsonstring равна нулю. Само собой разумеется, вопрос типа нуба, так как это первый раз для меня через 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: "

Ответы [ 5 ]

20 голосов
/ 23 марта 2011

Наткнулся по этой ссылке 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 для сериализации в / из словаря, чтобы перейти к бизнес-логике.Не очень красиво, но функционально.

3 голосов
/ 19 сентября 2011

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

[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.

2 голосов
/ 05 мая 2011

Вы пытались ввести {"jsonstring": "Frank"} в теле запроса (в построителе запросов фиддлера)?

0 голосов
/ 13 марта 2013

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

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

0 голосов
/ 22 марта 2011

Вы пробовали использовать атрибут [WebGet (UriTemplate = ..] вместо поста, чтобы посмотреть, сработает ли это? Вот пример - http://blogs.msdn.com/b/kaevans/archive/2007/09/04/creating-a-json-service-with-webget-and-wcf-3-5.aspx

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