【发布时间】:2011-11-18 16:43:27
【问题描述】:
我正在查看这篇文章:Returning raw json (string) in wcf。我想我遇到了同样的问题 我有一个返回 JSON 的休息服务,见下面的代码:
IRestServiceImpl.vb
Imports System.ServiceModel
Imports System.ServiceModel.Web
Namespace RestService
' NOTE: You can use the "Rename" command on the context menu to change the interface name "IRestServiceImpl" in both code and config file together.
<ServiceContract()> _
Public Interface IRestServiceImpl
<OperationContract()> _
<WebInvoke(Method:="GET", ResponseFormat:=WebMessageFormat.Xml, BodyStyle:=WebMessageBodyStyle.Wrapped, UriTemplate:="xml/{id}")> _
Function XMLData(ByVal id As String) As String
'WebMessageBodyStyle.Bare WAS WebMessageBodyStyle.wrapped
<OperationContract()> _
<WebInvoke(Method:="GET", ResponseFormat:=WebMessageFormat.Json, BodyStyle:=WebMessageBodyStyle.Wrapped, UriTemplate:="api/objects/json/?lat={lat}&lon={lon}&radius={radius}&cat={cat}")> _
Function JSONData(ByVal lat As String, ByVal lon As String, ByVal radius As String, ByVal cat As String) As String
'radius in meters
End Interface
End Namespace
RestServiceImpl.vb
Namespace RestService
Public Class RestServiceImpl
Implements IRestServiceImpl
Public Function XMLData(ByVal id As String) As String _
Implements IRestServiceImpl.XMLData
Return "XML You requested product " & id
End Function
Public Function JSONData(ByVal lat As String, ByVal lng As String, ByVal d As String, ByVal cat As String) As String _
Implements IRestServiceImpl.JSONData
'returns the results JSON in format
'Return "JSON lat=" + lat + " lng=" + lng + " d=" + d + " cat=" + cat
Dim sBuilder As New StringBuilder
sBuilder.Append("{""hotspots"": [")
sBuilder.Append("{""id"": ""test_1"",")
sBuilder.Append("""anchor"": { ""geolocation"": { ""lat"": 52.3729, ""lon"": 4.93 } }, ")
sBuilder.Append("""text"": {")
sBuilder.Append("""title"": ""The Layar Office"", ")
sBuilder.Append("""description"": ""The Location of the Layar Office"", ")
sBuilder.Append("""footnote"": ""Powered by Layar"" },")
sBuilder.Append("""imageURL"": ""http:\/\/custom.layar.nl\/layarimage.jpeg"",")
sBuilder.Append("}")
sBuilder.Append("],")
sBuilder.Append("""layer"": ""mytest"",")
sBuilder.Append("""errorString"": ""ok"", ")
sBuilder.Append("""errorCode"": 0")
sBuilder.Append("} ")
Return sBuilder.ToString
End Function
End Class
End Namespace
根据上面的代码,我得到了这个响应:
这在 Chrome 浏览器中给了我这个响应: {"JSONDataResult":"{\"热点\": [{\"id\": \"test_1\",\"anchor\": { \"geolocation\": { \"lat\": 52.3729, \ "lon\": 4.93 } }, \"text\": {\"title\": \"The Layar Office\", \"description\": \"The Location of the Layar Office\", \"footnote \": \"Powered by Layar\" },\"imageURL\": \"http:\/\/custom.layar.nl\/layarimage.jpeg\",}],\"layer\": \" mytest\",\"errorString\": \"ok\", \"errorCode\": 0} "}
由于另一个线程中描述的问题(因为我使用 WebMessageFormat.Json),我知道我的回复中有反斜杠。
但我不确定如何实现http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-web.aspx、http://msdn.microsoft.com/en-us/library/ms789010.aspx 和http://msdn.microsoft.com/en-us/library/cc681221(VS.90).aspx 上提供的代码示例
我现在将 Irestserviceimpl.vb 更改为:
Imports System.ServiceModel
Imports System.ServiceModel.Web
Imports System.IO
Namespace RestService
' NOTE: You can use the "Rename" command on the context menu to change the interface name "IRestServiceImpl" in both code and config file together.
<ServiceContract()> _
Public Interface IRestServiceImpl
<OperationContract()> _
<WebInvoke(Method:="GET", ResponseFormat:=WebMessageFormat.Xml, BodyStyle:=WebMessageBodyStyle.Wrapped, UriTemplate:="xml/{id}")> _
Function XMLData(ByVal id As String) As String
'WebMessageBodyStyle.Bare WAS WebMessageBodyStyle.wrapped
<OperationContract()> _
<WebInvoke(Method:="GET", ResponseFormat:=WebMessageFormat.Json, BodyStyle:=WebMessageBodyStyle.Bare, UriTemplate:="api/objects/json/?lat={lat}&lon={lon}&radius={radius}&cat={cat}")> _
Function JSONData(ByVal lat As String, ByVal lon As String, ByVal radius As String, ByVal cat As String) As String
'radius in meters
End Interface
Public Class RawService
<OperationContract(), WebGet()> _
Public Function GetValue() As System.IO.Stream
Dim result As String = "Hello world"
Dim resultBytes As Byte() = Encoding.UTF8.GetBytes(result)
WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain"
Return New MemoryStream(resultBytes)
End Function
End Class
End Namespace
但我仍然不确定如何调用 url 或在哪里放置确切的代码...如果有人可以帮助我从这里开始吗?
谢谢!
【问题讨论】: