3

我有一个简单的 wcf 消费者客户端,它将“echo”请求发送到基于 Java 的第 3 方生产者。我一直在努力让 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

4 回答 4

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(我使用来自第 3 方 WSDL 的 VS2012 的“添加服务引用”功能生成了我的代理)显示了这一点;

[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;

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

这一切都奏效了。

于 2013-09-10T12:09:26.690 回答
1

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

于 2013-09-09T12:43:14.187 回答
1

这行得通。删除 body style 属性,然后重试。

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

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

以下工作正常

[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json,
         UriTemplate = "/GetactivityDetailsByActivityId")]
于 2017-08-31T20:20:24.330 回答
0

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

  • 尝试在 SoapUi 中调用服务,并打开请求和响应的验证。它可能有助于检测问题。
  • 调试 Reference.cs 文件以更仔细地查看发生了什么
  • 使用 MessageInspector 查看 AfterReceiveReply 方法中收到的内容
  • 仔细检查命名空间,由于 Reference.cs 和实际服务中的命名空间不同,响应通常无法反序列化
于 2021-01-06T11:46:41.327 回答