带有json的WFC Rest服务PUT - 接收的对象始终为null

时间:2014-04-04 18:59:27

标签: c# json wcf rest

我有一个基于Windows服务的简单WCF REST客户端(基于WebServiceHost())。我可以从GET操作接收数据,然后在PUT操作上调用正确的方法,但是传递的json没有被反序列化为.NET对象。我总是将传递的对象变为null。

接收方法有两个参数,一个是来自uri的密钥,第二个是接收到的json数据。关键是我的方法正确。

我已启用日志记录,但没有任何反序列化错误。提琴手很高兴,收到200回应。我没有看到任何有趣的东西在看电报的内容。

我一直在关注围绕这个问题的其他帖子,从我可以看到的,我已经正确设置了一些内容。显然这不是真的,但我看不出有什么遗漏/错误。如果只有更多的诊断消息出来,这将更容易。我有配置文件调试设置为详细,但我没有看到实际的消息反序列化过程。

有没有办法进入实际的反序列化过程以进一步调试?

或者下面详细介绍我的设置是否有问题?

服务合同,Send()方法有两个参数:keymessage对象:

[ServiceContract]
public interface ILoader
{
    [OperationContract]
    [WebInvoke(Method = "PUT", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "Send/{key}")]
    string Send(string key, MessageBodyWrapper message);
}

我有消息包装器对象的数据协定设置:

[DataContract(Name = "MessageWrapper")]
public class MessageBodyWrapper
{
    private string _messageBody;
    private string _state;

    public MessageBodyWrapper()
    {
        _messageBody = "un-initialized";
    }

    [DataMember(Name="Message")]
    public string Message
    {
        get { return _messageBody; }
        set { _messageBody = value; }
    }

    public override string ToString()
    {
        JavaScriptSerializer js = new JavaScriptSerializer(); // Available in System.Web.Script.Serialization;
        return js.Serialize(this);
    }
 }

界面

public class Loader : ILoader
{
    private string _state;
    public Loader()
    {
        _state = "initialzied";
    }
    public string Send(string key, MessageBodyWrapper Message)
    {
       string ret = "Send here -- Message";
       return (ret);
    }
}

我使用fiddler发送样本PUT

User-Agent: Fiddler
Content-Type: application/json
Host: localhost:8080
Content-Length: 48

{"Message":"sdsdfsdf"}

1 个答案:

答案 0 :(得分:2)

我认为 JSON 的格式不正确。试试这个:

  1. OperationContract 中的BodyStyle更改为BodyStyle = WebMessageBodyStyle.Bare

  2. 请求时请尝试添加以下内容:

    Content-Type: application/json;charset=utf-8

  3. 如果仍然不起作用,请在ToString()课程中尝试覆盖 MessageBodyWrapper方法。

    public override string ToString()
    {
      JavaScriptSerializer js = new JavaScriptSerializer(); // Available in   System.Web.Script.Serialization;           
      return js.Serialize(this);
    }
    
  4. 现在制作一个MessageBodyWrapper的对象并调用ToString()方法,在这里您可以看到所需的 JSON 格式。

    MessageBodyWrapper mbw = new MessageBodyWrapper();
    string json = mbw.ToString(); // Hit break point here and "json" variable will contain required JSON format.
    

    获得 JSON 格式后,请尝试以该格式发送 JSON

    希望这会有所帮助!感谢