2014-04-04 55 views
1

我有一个简单的基于Windows服务的WCF REST客户端(基于WebServiceHost())。我可以从GET操作接收数据,并在PUT操作中调用正确的方法,但传递的json不会被反序列化为.NET对象。我总是将传入的对象变为空。WFC Rest服务PUT与JSON - 收到的对象始终为空

接收方法有两个参数,一个来自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); 
    } 
} 

我使用招送出样品PUT

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

{"Message":"sdsdfsdf"} 
+0

我向我的MessageBodyWrapper()类添加了ToString()方法。然后在我的主体中创建一个新对象并序列化它。然后我用Fidder作为另一个测试,但这并没有帮助。我真的认为我的配置存在一些问题,我无法发现。 –

回答

2

我觉得JSON是不正确的格式。试试这个:

  1. 更改BodyStyleOperationContract的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); 
    } 
    

现在做的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

希望这会有所帮助!谢谢

+0

你是什么意思的json格式不正确?另外请记住我的问题是接收json不发送它。发送json正在工作。 –

+0

你有试过上面的代码吗?运行此代码字符串json = mbw.ToString();它会向您显示您的服务将接受的JSON。 –

+0

我添加了ToString()并在我的主例程中创建了一个新的MessageBodyWrapper()。它序列化为:{“Message”:“sdsdfsdf”}从Fiddler发送该消息到我的代码时,我仍然为null。我真的认为我的代码中有一个配置问题,我无法找到。 –