C# WCF REST服务JSON Post数据

C# WCF REST服务JSON Post数据,c#,wcf,json,rest,post,C#,Wcf,Json,Rest,Post,正在寻找有关wcf 4 rest服务的一些指导,该服务基于VS2010中的wcf rest模板40(CS)扩展。在过去的几天里,我一直在努力让这个混蛋工作,查看其他帖子,虽然我已经接近了,但我似乎无法越过终点线。在经历了许多挫折之后,它终于找到了服务并发布(使用fiddler请求生成器),但是方法参数为null,但是它在请求生成器中被正确设置。我猜这可能是一个配置问题,但随着最后期限的临近,我没有时间进行更多的研究。FWIW,在调试中,jsonstring变量为null。不可否认,这是我第一次通

正在寻找有关wcf 4 rest服务的一些指导,该服务基于VS2010中的wcf rest模板40(CS)扩展。在过去的几天里,我一直在努力让这个混蛋工作,查看其他帖子,虽然我已经接近了,但我似乎无法越过终点线。在经历了许多挫折之后,它终于找到了服务并发布(使用fiddler请求生成器),但是方法参数为null,但是它在请求生成器中被正确设置。我猜这可能是一个配置问题,但随着最后期限的临近,我没有时间进行更多的研究。FWIW,在调试中,jsonstring变量为null。不可否认,这是我第一次通过休息来解决这个问题,任何帮助都将不胜感激

提前谢谢

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>
服务代码

[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: "

您是否尝试过使用[WebGet(UriTemplate=…]属性而不是post来查看其是否有效?下面是一个示例-

偶然发现此链接并看到Glenn的响应,即将流传递给该方法,然后使用streamreader将其拆分为字符串以获取表单post数据

修改了原型服务代码,如下所示

[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对其进行攻击,将其序列化到/从字典传递到业务逻辑。这不是很漂亮,但很实用。

您是否尝试在请求体中输入{“jsonstring”:“Frank”}(在fiddler的Request Builder中)?

我使用这一个,并且工作:

[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)
{
}
[WebInvoke(ResponseFormat=WebMessageFormat.Json,
RequestFormat=WebMessageFormat.Json,
BodyStyle=WebMessageBodyStyle.WrappedRequest,
Method=“POST”,
UriTemplate=“setExpositions?shelfId={shelfId}”)]
[经营合同]
公共布尔集合展示(int shelfId,List expositions)
{
}

其中shelfId在GET中传递,而exposition在消息体中作为JSON数据传递。

我认为
BodyStyle=WebMessageBodyStyle.WrappedRequest中可能存在问题,这将-我认为,尽管文档完全不清楚-期望使用方法名包装元素


将其设置为unwrapped,并将请求正文设置为
'{“Name”:“Frank”}'
(请注意它周围的单引号。实际上,您发布的是一个包含JSON的字符串。我不知道您为什么要这样做。这让我想起了他们将xml放在xml中的位置。您将JSON放在JSON中。

忘了提一下,解决方案将IIS 7用于web服务器,而不是apnet调试服务器。我有一个webget方法defined按预期返回,当前已注释掉以清理代码以关注帖子。我使用webinvoke方法将其设置到位,并在stackoverflow上找到一篇帖子(现在找不到)这意味着不包括这些。在删除之前,我根本没有通过,收到了404,删除之后,我现在收到了200条回复,但没有数据。如果我将其保留为根(“”),这似乎无关紧要或者将终结点放在您使用的IIS操作系统和版本、IIS Express或web dev服务器中?应用程序池设置为什么框架?404错误可能是因为与此相关的问题,2008 r2 sp1 IIS 7,其中.Net 4注册为aspnet_regiis.exe。有关在IIS 7中向何处添加引用的dll的任何指针?还在wi上尝试安装了IIS的N7 sp1,但我认为这是IIS 7.5…但仍然没有效果。更新:已启用跟踪,并且在反序列化过程中出现异常…“反序列化过程中XML中遇到一个未识别的元素wsa,该元素已被忽略。”我的理解是,对于wcf 4中的新路由,我不必担心定义端点。有人知道这是不是真的吗?必须对此投反对票,因为OA专门询问发布。web上充满了GET的示例,这些示例很容易实现,但我来到这个问题时,是在寻找一个答案,说明在进行一次发布时需要做哪些更改POST和此答案表示使用GET。您能给我们展示一些与此操作一起工作的JSON数据示例吗?我认为这是真正的答案。当包装JSON时,JSON按名称反序列化到方法参数中。发现调用Close和/或Dispose会弄乱响应,导致服务错误“消息已被释放”
[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)
{
}