我有一个基于Windows服务的简单WCF REST客户端(基于WebServiceHost())。我可以从GET操作接收数据,然后在PUT操作上调用正确的方法,但是传递的json没有被反序列化为.NET对象。我总是将传递的对象变为null。
接收方法有两个参数,一个是来自uri的密钥,第二个是接收到的json数据。关键是我的方法正确。
我已启用日志记录,但没有任何反序列化错误。提琴手很高兴,收到200回应。我没有看到任何有趣的东西在看电报的内容。
我一直在关注围绕这个问题的其他帖子,从我可以看到的,我已经正确设置了一些内容。显然这不是真的,但我看不出有什么遗漏/错误。如果只有更多的诊断消息出来,这将更容易。我有配置文件调试设置为详细,但我没有看到实际的消息反序列化过程。
有没有办法进入实际的反序列化过程以进一步调试?
或者下面详细介绍我的设置是否有问题?
服务合同,Send()
方法有两个参数:key
和message
对象:
[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"}
答案 0 :(得分:2)
我认为 JSON 的格式不正确。试试这个:
将 OperationContract 中的BodyStyle
更改为BodyStyle = WebMessageBodyStyle.Bare
请求时请尝试添加以下内容:
Content-Type: application/json;charset=utf-8
如果仍然不起作用,请在ToString()
课程中尝试覆盖 MessageBodyWrapper
方法。
public override string ToString()
{
JavaScriptSerializer js = new JavaScriptSerializer(); // Available in System.Web.Script.Serialization;
return js.Serialize(this);
}
现在制作一个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 。
希望这会有所帮助!感谢