WCF 无法获取 json
WCF Unable to get json
我在 json 进入我的 WCF REST 服务时遇到问题。
<ServiceContract()>
Public Interface IMyService
<OperationContract()>
<WebInvoke(Method:="POST",
RequestFormat:=WebMessageFormat.Json,
ResponseFormat:=WebMessageFormat.Json,
UriTemplate:="notify",
BodyStyle:=WebMessageBodyStyle.Bare)>
Sub Notify(message As String)
End Interface
...
<service name="MyService" behaviorConfiguration="ServiceBehavior">
<endpoint binding="webHttpBinding" behaviorConfiguration="webHttp" bindingConfiguration="webBinding" contract="IMyService" />
</service>
...
<endpointBehaviors>
<behavior name="webHttp">
<webHttp />
</behavior>
</endpointBehaviors>
...
当我 POST 使用负载 http://localhost:64574/MyService.svc/notify 到我的服务时:
{
"Id":“123456789”,
"Code":“1”,
"ExId":“123456789”,
"title" : "Title",
"message" : "Sample Message"
}
我收到以下错误。
The server encountered an error processing the request. The exception
message is 'There was an error deserializing the object of type
System.String. End element 'root' from namespace '' expected. Found
element 'Id' from namespace ''.'. See server logs for more details.
The exception stack trace is:
at
System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator
reader, Boolean verifyObjectName, DataContractResolver
dataContractResolver) at
System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject(XmlDictionaryReader
reader, Boolean verifyObjectName) at
System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.ReadObject(Message
message) at
System.ServiceModel.Dispatcher.SingleBodyParameterDataContractMessageFormatter.ReadObject(Message
message) at
System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.DeserializeRequest(Message
message, Object[] parameters) at
System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(Message
message, Object[] parameters) at
System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest(Message
message, Object[] parameters) at
System.ServiceModel.Dispatcher.CompositeDispatchFormatter.DeserializeRequest(Message
message, Object[] parameters) at
System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc&
rpc) at
System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&
rpc) at
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&
rpc) at
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc&
rpc) at
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&
rpc) at
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&
rpc) at
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc&
rpc) at
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc&
rpc) at
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&
rpc) at
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc&
rpc) at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean
isOperationContextSet)
编辑:
理想情况下,我想使用 OperationContext.Current.RequestContext.RequestMessage 从请求正文中获取原始 json,但似乎我只能获取 xml。当我使用 JsonConvert.SerializeXmlNode(doc) 时,我得到 json 但不是我期望的原始 json。
您可以使用 System.IO.Stream 作为参数。
示例:
WCF 服务接口:
<ServiceContract()>
Public Interface IService1
<OperationContract()>
Sub NotifyStream(jsonStream As Stream)
End Interface
WCF 服务实现:
Public Class Service1 Implements IService1
Public Sub NotifyStream(jsonStream As Stream) Implements IService1.NotifyStream
Dim jsonString = ""
Using reader As New StreamReader(jsonStream, Encoding.UTF8)
jsonString = reader.ReadToEnd
End Using
'Do something with jsonString'
End Sub
End Class
WCF 客户端:
Dim client = New Service1Client
Dim jsonString = "{ 'Id' : '123456789', 'Code' : '1', 'ExId' : '123456789', 'title' : 'Title', 'message' : 'Sample Message' }"
Dim stream = New MemoryStream(Encoding.UTF8.GetBytes(jsonString))
client.NotifyStream(stream)
文档:
- MSDN 文章:How to: Enable Streaming
我在 json 进入我的 WCF REST 服务时遇到问题。
<ServiceContract()>
Public Interface IMyService
<OperationContract()>
<WebInvoke(Method:="POST",
RequestFormat:=WebMessageFormat.Json,
ResponseFormat:=WebMessageFormat.Json,
UriTemplate:="notify",
BodyStyle:=WebMessageBodyStyle.Bare)>
Sub Notify(message As String)
End Interface
...
<service name="MyService" behaviorConfiguration="ServiceBehavior">
<endpoint binding="webHttpBinding" behaviorConfiguration="webHttp" bindingConfiguration="webBinding" contract="IMyService" />
</service>
...
<endpointBehaviors>
<behavior name="webHttp">
<webHttp />
</behavior>
</endpointBehaviors>
...
当我 POST 使用负载 http://localhost:64574/MyService.svc/notify 到我的服务时:
{ "Id":“123456789”, "Code":“1”, "ExId":“123456789”, "title" : "Title", "message" : "Sample Message" }
我收到以下错误。
The server encountered an error processing the request. The exception message is 'There was an error deserializing the object of type System.String. End element 'root' from namespace '' expected. Found element 'Id' from namespace ''.'. See server logs for more details. The exception stack trace is:
at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver) at System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject(XmlDictionaryReader reader, Boolean verifyObjectName) at System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.ReadObject(Message message) at System.ServiceModel.Dispatcher.SingleBodyParameterDataContractMessageFormatter.ReadObject(Message message) at System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.DeserializeRequest(Message message, Object[] parameters) at System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(Message message, Object[] parameters) at System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest(Message message, Object[] parameters) at System.ServiceModel.Dispatcher.CompositeDispatchFormatter.DeserializeRequest(Message message, Object[] parameters) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
编辑: 理想情况下,我想使用 OperationContext.Current.RequestContext.RequestMessage 从请求正文中获取原始 json,但似乎我只能获取 xml。当我使用 JsonConvert.SerializeXmlNode(doc) 时,我得到 json 但不是我期望的原始 json。
您可以使用 System.IO.Stream 作为参数。
示例:
WCF 服务接口:
<ServiceContract()>
Public Interface IService1
<OperationContract()>
Sub NotifyStream(jsonStream As Stream)
End Interface
WCF 服务实现:
Public Class Service1 Implements IService1
Public Sub NotifyStream(jsonStream As Stream) Implements IService1.NotifyStream
Dim jsonString = ""
Using reader As New StreamReader(jsonStream, Encoding.UTF8)
jsonString = reader.ReadToEnd
End Using
'Do something with jsonString'
End Sub
End Class
WCF 客户端:
Dim client = New Service1Client
Dim jsonString = "{ 'Id' : '123456789', 'Code' : '1', 'ExId' : '123456789', 'title' : 'Title', 'message' : 'Sample Message' }"
Dim stream = New MemoryStream(Encoding.UTF8.GetBytes(jsonString))
client.NotifyStream(stream)
文档:
- MSDN 文章:How to: Enable Streaming