WCF客户端接收空响应值

时间:2013-09-09 12:29:16

标签: c# wcf null response producer-consumer

我有一个简单的wcf消费者客户端,它向第三方基于Java的生产者发送“echo”请求。 我已经挣扎了一段时间才能正确运行WS-Security,但现在可以发送请求并收到回复。 只有当回复到达我的客户端时,该值才为空。

我已经使用IClientMessageInspector验证我有正确的回复,但我对服务的调用总是返回null。

这是我的客户代码; (对“MyEndPointBehavior”的调用只是添加了消息检查器)

string echoString = EchoTesttextbox.Text;

string url = "https://somewhere.com/uk-producer/UKService";

// create the endpoint address
EndpointAddress endPointAddress = new EndpointAddress(new Uri(url), EndpointIdentity.CreateDnsIdentity("TestProducer"));

PortBindingClient client = new PortBindingClient("Port12", endPointAddress);
client.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.Root, X509FindType.FindByThumbprint, ".....");
client.ClientCredentials.ServiceCertificate.SetDefaultCertificate(StoreLocation.LocalMachine, StoreName.TrustedPeople, X509FindType.FindByThumbprint, ".....");
client.Endpoint.Behaviors.Add(new MyEndpointBehavior());

string response = String.Empty;
response = client.echo(echoString);

MessageBox.Show(response);

我的消息代码;

public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
     // Implement this method to inspect/modify messages after a message
     // is received but prior to passing it back to the client

     // make a copy of the reply that we can play with
     MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue);
     // the message variable holds a reference to a copy of the initial reply
     Message message = buffer.CreateMessage();

     // assign a copy back to the ref received so it can continue undisturbed
     reply = buffer.CreateMessage();

     StringWriter stringWriter = new StringWriter();
     XmlTextWriter xmlTextWriter = new XmlTextWriter(stringWriter);
     message.WriteBody(xmlTextWriter);
     xmlTextWriter.Flush();
     xmlTextWriter.Close();

     string body = stringWriter.ToString();

}

我的问题是IClientMessageInspector.AfterReceiveReply之间发生了什么,并试图在我的MessageBox中显示响应? 如果我能够尝试并了解正在发生的事情,我可以尝试找出为什么没有通过这些反应。

4 个答案:

答案 0 :(得分:3)

那太令人沮丧了。 我收到空值的原因与名称空间有关。

在IClientMessageInspector中,我可以检查SOAP主体并看到这个

<soapenv:Body wsu:Id="Id-1555290177" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<me:EchoResponse xmlns:me="http://somewhere.com/uk-producer/UKService">test11</me:EchoResponse>
</soapenv:Body>

WSDL和reference.cs(我使用VS2012的“添加服务引用”功能从第三方WSDL生成我的代理)显示了这一点;

[System.ServiceModel.MessageBodyMemberAttribute(Name="EchoResponse", Namespace="http://somewhere.com/uk-producer/UKService/", Order=0)]
public string EchoResponse1;

很长一段时间,一切都很好看。 但是,出于沮丧,我尝试将reference.cs改为此

[System.ServiceModel.MessageBodyMemberAttribute(Name="EchoResponse", Namespace="http://somewhere.com/uk-producer/UKService", Order=0)]
public string EchoResponse1;
  

我只删除了命名空间的最后一个正斜杠

这一切都奏效了。

答案 1 :(得分:1)

首先设置一个不使用任何安全性的服务(甚至是存根)。然后查看它发送的消息并与检查员发送的消息进行比较。

答案 2 :(得分:1)

这很有效。删除正文样式属性,然后重试。

以下属性将null值传递给参数

[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, **BodyStyle = WebMessageBodyStyle.WrappedRequest**,
         UriTemplate = "/GetactivityDetailsByActivityId")]

以下工作正常

[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json,
         UriTemplate = "/GetactivityDetailsByActivityId")]

答案 3 :(得分:0)

如果你在 WCF 客户端得到空响应,一些建议:

  • 尝试在启用请求和响应验证的情况下调用 SoapUi 中的服务。它可能有助于检测问题。
  • 调试 Reference.cs 文件以更仔细地查看正在发生的事情
  • 使用 MessageInspector 查看 AfterReceiveReply 方法中收到的内容
  • 仔细检查命名空间,由于 Reference.cs 和实际服务中的命名空间不同,响应通常无法反序列化