【问题标题】:WFC Rest service PUT with json -- received object is always null带有 json 的 WFC Rest 服务 PUT -- 接收到的对象始终为空
【发布时间】: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 中使用它作为另一个测试,但这没有帮助。我真的认为我的配置存在一些我无法发现的问题。

标签: c# json wcf rest


【解决方案1】:

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

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

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

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

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

    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

希望这会有所帮助!谢谢

【讨论】:

  • json格式不正确是什么意思?另请记住,我的问题是接收 json 而不是发送它。正在发送 json。
  • 你试过上面的代码吗?运行此代码字符串 json = mbw.ToString();它会向您显示您的服务将接受的正确 JSON。
  • 我添加了 ToString() 并在我的主程序中创建了一个新的 MessageBodyWrapper()。它序列化为: {"Message":"sdsdfsdf"} 从 Fiddler 将该消息发送到我的代码时,我仍然得到 null。我真的认为我的代码中存在我无法发现的配置问题。
  • 您是否将 BodyStyle 从 Wrapped 更改为 Bare?
  • 将 BodyStyle 从 Wrapped 更改为 Bare 可以使代码正常工作,我现在可以正确地将 json 接收到代码中。那么 Wrapped 是干什么用的呢?只接收请求正文中的 XML?此外,网上还有一些示例似乎使用 Wrapped 接收 json。这些程序是否以某种方式在其他地方用其他配置覆盖了它,使它看起来只使用包装?不管所有这些问题,感谢您的帮助!
猜你喜欢
  • 2011-08-28
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 2018-05-05
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
相关资源
最近更新 更多