我有一个WCF REST服务,其操作如下:
[OperationContract]
[WebInvoke(UriTemplate = "/User", BodyStyle = WebMessageBodyStyle.Bare, Method = "POST", RequestFormat = WebMessageFormat.Json)]
void User(User user);
当我从Fiddler调用它时,如果我像这样指定Content-Type =“application / json”,它可以正常工作:
Content-Type: application/json
Host: localhost:58150
Content-Length: 172
Expect: 100-continue
但是如果我排除了Content-Type,那么我会收到错误400,因为它试图以XML格式处理请求体。这非常令人讨厌,你真的会认为设置RequestFormat = WebMessageFormat.Json会使我不必指定Content-Type,但事实并非如此。事实上,如果我放弃'RequestFormat'没有任何改变。我也为WebMessageBodyStyle尝试'包装',但随后DTO通过null。
要澄清,如果我在帖子的正文中使用XML(并省略了Content-Type),就会发生这种情况......所以我真正想要实现的是:
如何在使用WebInvoke时使我的WCF Rest方法不需要Content-Type(我希望WCF能够自动计算出来)
这让我疯狂请帮忙。
答案 0 :(得分:0)
您是否尝试将端点行为的automaticFormatSelectionEnabled
设置为true?
请注意,此属性特定于.NET 4.0,我记得使用它来格式化基于HTTP的Accept标头的响应消息。
我还没有尝试重现您的方案,但请阅读此官方文档link,其中说明了以下内容:
如果请求消息包含Windows的Accept标头 Communication Foundation(WCF)基础结构搜索一种类型 它支持。如果Accept标头指定其媒体的优先级 类型,他们很荣幸。如果在Accept中找不到合适的格式 标头,使用请求消息的内容类型。 如果没有 指定了合适的content-type,默认格式为 使用了操作。
以下是msdn关于如何设置automaticFormatSelectionEnabled的示例。
<behaviors>
<endpointBehaviors>
<behavior>
<webHttp automaticFormatSelectionEnabled="true" />
</behavior>
</endpointBehaviors>
</behaviors>
答案 1 :(得分:0)
您需要在WebHttpBinding上添加WebContentTypeMapper。在那里,您可以告诉WCF运行时提供的WebContentFormat提供的(或假定的)内容类型mime值。通常,当收到没有内容类型标题的POST时,这将是&#34; application / x-www-form-urlencode&#34; (multipart / form-data或text / plain也可以发生,所以要注意)。简单地告诉WCF这是Json或Xml(或者你需要的任何东西),它只会起作用(你的millage可能会有所不同)。
public class YourContentTypeMapper : WebContentTypeMapper
{
public override WebContentFormat GetMessageFormatForContentType(string contentType)
{
if (contentType == "application/x-www-form-urlencode")
{
return WebContentFormat.Json; // assuming this is wanted
}
else
{
return WebContentFormat.Default;
}
}
}
只需在WebHttpBinding上将ContentTypeMapper设置为类的实例(这可以在配置文件中以及与contentTypeMapper属性的绑定中完成)
var binding = new WebHttpBinding();
binding.ContentTypeMapper = new YourContentTypeMapper();
更多信息=&gt; https://msdn.microsoft.com/en-us/library/bb943479(v=vs.110).aspx