【问题标题】:Why is my Json string response escaped for a WCF Rest web service (weakly-typed Json) response?为什么我的 Json 字符串响应会针对 WCF Rest Web 服务(弱类型 Json)响应进行转义?
【发布时间】:2017-06-27 14:07:32
【问题描述】:

我有这份合同:

[ServiceContract]
public interface IServiceJsonContract
{
    [WebInvoke(UriTemplate = "/MyMethod", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST")]
    Message MyMethod(Message input);
}

MyMethod 的定义是:

Message MyMethod(Message input)
{
...
Message response = Message.CreateMessage(
                                 MessageVersion.None,
                                 "*",
                                 "{\"bla\": 2 }", 
                                 new DataContractJsonSerializer(typeof(string)));

response.Properties.Add( WebBodyFormatMessageProperty.Name,new 
WebBodyFormatMessageProperty(WebContentFormat.Json)); 

var contextOutgoingResponse = WebOperationContext.Current.OutgoingResponse;
contextOutgoingResponse.ContentType = "application/json;charset=utf-8";

return response;
}

调用方法时,我得到了 Json 转义:

"{\"bla\": 2 }"

而不是未转义的(如下):

"{"bla": 2 }"

知道如何获取未转义的 Json ("{"bla": 2 }") 吗?

谢谢

【问题讨论】:

  • 您应该传递字典或对象,而不是构建自己的 JSON。
  • 谢谢,SLaks。你能提供一个简短的例子吗?(在我的情况下,我有一个字符串,DataContractJsonSerializer 也是字符串,但这会逃避响应

标签: c# .net json rest wcf


【解决方案1】:

DataContractJsonSerializer 正在序列化您的字符串并转义引号。创建一个类来保存您的数据并传递它而不是字符串。

public class MyData 
{
    public string Bla { get; set; } 
}

// create an instance
MyData myData = new MyData()
{
    Bla = "the value";
};   

// then use it
Message response = Message.CreateMessage(
                             MessageVersion.None,
                             "*",
                             myData, 
                             new DataContractJsonSerializer(typeof(MyData)));

【讨论】:

  • 谢谢,但我的 Json 类型较弱,这意味着 Json 响应不能通过类型(使用类)来键入。我有一个字符串的响应,我只是不知道如何将其发送回未转义的发件人
【解决方案2】:

您可以使用Stream 作为您的输出。这样你就可以发回不封顶的字符串:

    [ServiceContract]
    public interface IServiceJsonContract
    {
        [WebInvoke(UriTemplate = "/MyMethod", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST")]
        Stream MyMethod(Message input);
    }

Stream MyMethod(Message input)
{
..
return new MemoryStream(Encoding.UTF8.GetBytes("{\"bla\": 2 }"));
}

【讨论】:

  • 我知道这个选项,大卫,它很有效,非常感谢。是我现在用的。但是,当我部署 Web 服务时出现错误。抱怨说,如果我将 Message 作为参数,我还需要将 Message 作为响应(我试图使用 2 个端点、json 和 soap 公开 Web 服务)。我最终创建了 2 个 Web 服务,一个肥皂和一个 json 服务。 Json 的定义与您的完全相同(但最好以 Message 的形式返回,最终只有一个 Web 服务)
  • 欢迎您,亲爱的@Cezar。不幸的是,您不能同时拥有这样的宁静和肥皂服务。
  • 这是您尝试获取 wsdl 时的错误:调用 WSDL 导出扩展时引发异常:DataContractSerializerOperationBehavior 合同:tempuri.org/:IServiceJsonContract ----> System.InvalidOperationException:操作无法加载“MyMethod”,因为它具有 System.ServiceModel.Channels.Message 类型的参数或返回类型,或者具有 MessageContractAttribute 和其他不同类型参数的类型。使用 System.ServiceModel.Channels.Message 或带有 MessageContractAttribute 的类型时,该方法不得使用任何其他类型的参数。
猜你喜欢
  • 1970-01-01
  • 2018-05-08
  • 2011-04-29
  • 1970-01-01
  • 2016-07-01
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
相关资源
最近更新 更多