【问题标题】:C# WCF JSON Return StringC# WCF JSON 返回字符串
【发布时间】:2017-03-07 00:40:09
【问题描述】:

我创建了一个简单的 WCF 服务,他工作正常。 配置如下 接口有这个配置

   [OperationContract]
    [WebInvoke(Method = "GET",
                  ResponseFormat = WebMessageFormat.Json,
                  BodyStyle = WebMessageBodyStyle.Bare,
                  UriTemplate = "checkSymbolExistJson/{pSymbol}")]
     string checkSymbolExistJson(string pSymbol);

实现是这样的

         public string checkSymbolExistJson(string pSymbol)
      {
            Person p    = new Person();
            p.name      = pSymbol;
            p.age       = 15;

        string json = JsonConvert.SerializeObject(p);
        return json;
      }

如果我在浏览器“http://localhost/MetaTraderWcf/rzManageQuotes.svc/checkSymbolExistJson/testename”中输入 URL,我会在浏览器中得到这个结果

"{\"name\":\"testename\",\"age\":15}"

在我制作了一个 win 32 应用程序以获取此 WCF 服务的 http 结果之后。 我使用此代码读取 HTML 页面

        public string readUrl(string pUrl)
    {
        WebClient client = new WebClient { Encoding = System.Text.Encoding.UTF8 };
        return client.DownloadString(pUrl);
    }

我使用此代码读取 JSON 动态标签

       private void button2_Click(object sender, EventArgs e)
    {

         string tmpToken = readUrl(url.Text);
        // string tmpToken = "{\"name\":\"testename\",\"age\":15}";
        JToken token = JObject.Parse(tmpToken);

              string page = (string)token.SelectToken("name");
              jSONResult.Text = page;

    }

如果我在上面运行代码,下面是固定代码

string tmpToken = "{\"name\":\"testename\",\"age\":15}";

结果是正确的,我得到的结果是“testename”。

但是当我调试读取 Html 页面时,我会收到带有此字符串的 tmpToken 值

"\"{\\"name\\":\\"testename\\",\\"age\\":15}\""

当我读取名称的动态值时出现错误

Newtonsoft.Json.dll 中出现“Newtonsoft.Json.JsonReaderException”类型的未处理异常

附加信息:从 JsonReader 读取 JObject 时出错。当前的 JsonReader 项目不是对象:字符串。路径'',第 1 行,位置 37.

如果我更改界面以返回类似此代码的 XML 页面

       [OperationContract]
     [WebInvoke(Method = "GET",
                  ResponseFormat = WebMessageFormat.Xml,
                  BodyStyle = WebMessageBodyStyle.Bare,
                  UriTemplate = "checkSymbolExistJson/{pSymbol}")]
     string checkSymbolExistJson(string pSymbol);

我在浏览器中得到以下结果

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">{"name":"testename","age":15}</string>

从 XML 结果中删除标签后,我得到正确的名称的读取 JSON 值。

问题是 有一些方法可以在 c# 中读取纯 JSON 格式的字符串,就像读取浏览器格式一样 像这样

{"name":"testename","age":15}

又不喜欢这种格式

"\"{\\"name\\":\\"testename\\",\\"age\\":15}\""

【问题讨论】:

  • 您的“浏览器结果”不应在外部包含引号或反斜杠。另请注意,调试器有助于显示字符串“转义”,因为您可以在源代码中编写它。

标签: c# json wcf


【解决方案1】:

有一个简单的解决方案。只返回stream 除了string

     public stream checkSymbolExistJson(string pSymbol)
  {
        Person p    = new Person();
        p.name      = pSymbol;
        p.age       = 15;

    string json = JsonConvert.SerializeObject(p);
    return new MemoryStream(Encoding.UTF8.GetBytes(json));
  }

或者我建议使用 Web API 代替 WCF。

【讨论】:

  • 您的代码有效!但是请注意,如果我在 google chrome 中请求 URL,则 chrome 下载文件,如果我在 IE 或 EDGE 中执行 URL,则结果为文本,最后,如果我使用 Win 32 Application 读取代码,则结果为 Ok 。唯一的问题是镀铬工艺。谢谢。
  • 我很高兴能帮上忙。 chrome 或其他网络浏览器设计用于下载流。他们无法确定流是简单的字符串还是文件。所以他们只是下载它。
猜你喜欢
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 2012-05-03
  • 2013-08-16
相关资源
最近更新 更多