在使用WebInvoke时,如何使我的WCF Rest方法不需要Content-Type

时间:2013-06-13 00:04:54

标签: json wcf rest

我有一个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能够自动计算出来)

这让我疯狂请帮忙。

2 个答案:

答案 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