2010-01-20 75 views
1

我想要做的是,看似简单:通过请求正文发送一些POX,让WCF服务处理它,并返回201状态码。在我的服务合同中,我定义了以下方法:在WCF ReSTful服务中,POST或PUT请求的内容类型是否需要为“application/x-www-form-urlencoded”?

[WebInvoke(Method = "PUT", UriTemplate = "/content/add", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml, RequestFormat=WebMessageFormat.Xml)] 
    [OperationContract] 
    Stream AddContent(Stream input); 

这里的动词没有关系;我可以很容易地用'POST'替换'PUT',并以相同的结果结束。上述方法的实现如下:

public Stream AddContent(Stream input) 
    { 
     WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Created; 
    } 

由于这种方法实际上做的是无关紧要的我省略了所有的程序代码。为了测试这个功能,我发射了小提琴手,并发表了如下要求:

User-Agent: Fiddler 
Host: myhost.com 
Content-Length: 771 
Content-Type: text/xml && application/xml; charset: utf8 
<xmlDataGoesHere></xmlDataGoesHere> 

的内容类型提供的值是不正确的,我知道,我只是用它来说明,我已经尝试过的Content-Type的。如果我点击Fiddler中的'执行',我的服务中的响应代码是400错误请求。值得注意的是,我的服务方法实际上并没有在这个secnario中受​​到攻击,请求在它到达之前就已经死亡。因此,大量丰富消除的阅读和过程后,我改变了内容类型到:

Content-Type: application/x-www-form-urlencoded 

如果我现在执行的提琴手要求从我的服务返回的状态代码是201创建。有什么我想我为什么不能将Content-Type设置为URLEncoded以外的任何东西?我曾尝试调整ServiceContract中的BodyStyle和RequestFormat属性,但这些属性对结果没有任何影响。任何人都可以阐明为什么会发生这种情况?

回答

0

好,我已经想通了这一点,我遇到的问题是“设计”。我找到了'WCF'Raw'编程模型' - 接收任意数据'在http://blogs.msdn.com/carlosfigueira/这导致了解决方案。这里的解决方案是创建我自己的customBinding,随着博客指出,它会一直返回原始编码器。感谢所有的帮助。

0

我认为这个问题是有关当您发送XML到的WebHttpBinding,它检测到您发送XML,并试图反序列化的事实。它忽略了您的签名期望流的事实。有我看到的解决方法,但目前我找不到链接。如果我找到他们,我会更新帖子。

看看这个http://wcfrestcontrib.codeplex.com/

+0

感谢您的回复。但即使使用POX格式化程序,如下所示:http://wcfrestcontrib.codeplex.com/wikipage?title=De%2fserialization%20Overview&referringTitle=Home不允许我传入text/xml作为内容类型。此外,它还阻止了我通过application/x-www-form-urlencoded。这两个请求都会导致400个错误! – dparsons 2010-01-20 18:10:32

相关问题