2011-12-01 151 views
5

我有这个简单的Web服务,现在它只是看看如果部件号是A123456789,然后它返回一个型号。这将被连接到数据库的逻辑取代,以检查partno,然后返回实际的型号。但在这一点上,我只需要它返回一些虚拟的JSON数据。然而,当我使用Fiddler,并期待在通话中http://localhost:PORT/Scan/Model/A123456789网络broswer它返回REST风格的Web服务返回XML而不是JSON

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Model: CVS-1679</string> 

但是,当我在同一个URI的小提琴手做一个GET我得到

"Model: CVS-1679" 

只有下textview选项卡。

当我将ResponseFormat设置为JSON时,为什么它以XML(浏览器和Fiddler中的文本)而不是JSON返回?

我的代码:

[WebGet(UriTemplate = "Model/{partno}", ResponseFormat = WebMessageFormat.Json)] 
     public string Model(string partno) 
     { 
      if (partno == "A123456789") 
      { 
       string modelno = "CVS-1679"; 
       return "Model: " + modelno; 
      } 
      else 
      { 
       string modelno = "CVS-1601"; 
       return "Model: " + modelno; 
      } 
     } 
+1

确保在向REST服务发出请求时将Content-Type设置为application/json – Rajesh

回答

5

ASP.NET web服务返回的XML/SOAP消息。如果你想返回Json字符串,你需要用[ScriptService]属性修饰Webservice。这通知IIS该服务将被ASP.NET AJAX调用使用。这些属性是System.Web.Extensions的一部分。

您可以通过装饰与ScriptMethod属性将WebMethod定义Web方法响应格式。

[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 

但是,即使在用这些属性装饰webservice和webmethod之后,响应仍然可以是XML格式。此行为发生时发出请求的客户端不会设置请求头的内容类型为“应用/ JSON”。

收益从之前的WebMethod方法调用中使用招

这是很容易使用Fiddler来测试Web服务使用JavaScriptSerializer

调试WebService的序列化JSON字符串。下图是如何调用WebService的返回一个JSON字符串的例子。请注意,请求内容类型设置为application/json。 webserivce预期的参数在Request Body部分中列出。 enter image description here

请注意,请求内容类型设置为application/json。

4

它以JSON如果你看一下你得到的数据的格式返回...

key: value 

或在您的情况

string Model = "CVS-1679" 

当您在fiddler中查看它时,您会看到从一个MS端点到另一个MS端点的原始序列化传输。序列化在.NET框架中的反序列化元素负责通过线路传输它,以便当您在对象端将对象返回到您的.NET应用程序中时,您会得到一个名为Model的变量,并带有您期望的值。

如果您尝试发送,你会看到很多的嵌套的XML标记的整个类,但是当你在你的代码获得对象,你会在对象层次看一等公民。

它出现在你的浏览器的原因是因为,浏览器不知道如何反序列化它,所以只是在默认情况下显示文本