通过WCF接收JSON(POST)时出错

时间:2016-11-06 16:40:01

标签: c# json wcf http visual-studio-2015

所以我的WCF服务需要能够接收JSON POST请求,比如说:

{
    "firstname": "Billy",
    "lastname": "Jean"
}

带标题:

"Content-Type": "application/json"

为此,我想出了以下内容。

我的界面:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebInvoke(UriTemplate = "/PostOmnis", 
        Method = "POST", 
        BodyStyle = WebMessageBodyStyle.Bare,
        RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json)]
    System.Net.HttpStatusCode GetOmnisJson(Stream json);
}

我的课程:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
public class Service1 : IService1
{
    public class MyMapper : WebContentTypeMapper
    {
        public override WebContentFormat GetMessageFormatForContentType(string contentType)
        {
            return WebContentFormat.Raw; // always
        }
    }
    static Binding GetBinding()
    {
        CustomBinding result = new CustomBinding(new WebHttpBinding());
        WebMessageEncodingBindingElement webMEBE = result.Elements.Find<WebMessageEncodingBindingElement>();
        webMEBE.ContentTypeMapper = new MyMapper();
        return result;
    }

    public System.Net.HttpStatusCode GetOmnisJson(Stream inputJsonStream)
    {
        StreamReader reader = new StreamReader(inputJsonStream);
        string inputJson = reader.ReadToEnd();

        // parse JSON string
        .....
        ...
        .

        // return HTTP 200
        return System.Net.HttpStatusCode.OK;
    }

但是,通过Postman发送一些JSON,例如:

enter image description here enter image description here

给我以下错误:

  

操作'GetOmnisJson'的传入消息(合约'IService1'   命名空间“http://tempuri.org/”包含无法识别的http   体格值'Json'。预期的正文格式值为“Raw”。   这可能是因为尚未配置WebContentTypeMapper   绑定。有关更多信息,请参阅WebContentTypeMapper的文档   的信息。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

三个选项:

  1. GetOmnisJson(Stream json)更改为GetOmnisJson(YourPeopleClass person)
  2. 不要在标头中传递"Content-Type": "application/json"(由于其他人正在使用该服务,并且您希望行为正常,因此并非总是这样)
  3. 继续使用Stream,并创建一个RawContentTypeMapper来捕获内容类型,并仍然将其视为Raw。有关其他操作方法,请参见我对另一个问题的回答:https://stackoverflow.com/a/54954261/631277