【发布时间】:2014-04-04 18:59:27
【问题描述】:
我有一个简单的基于 Windows 服务的 WCF REST 客户端(基于 WebServiceHost())。我可以从 GET 操作接收数据,并在 PUT 操作上调用正确的方法,但是传递的 json 没有反序列化为 .NET 对象。对于传递给我的对象的对象,我总是得到 null。
接收方法有两个参数,一个是来自uri的key,第二个是接收到的json数据。关键是正确地进入我的方法。
我已打开日志记录,但没有任何反序列化错误。 Fiddler 很高兴,它收到了 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"}
【问题讨论】:
-
我在 MessageBodyWrapper() 类中添加了一个 ToString() 方法。然后在我的 main 中创建了一个新对象并将其序列化。然后我在 Fidder 中使用它作为另一个测试,但这没有帮助。我真的认为我的配置存在一些我无法发现的问题。