我有一个简单的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中显示响应? 如果我能够尝试并了解正在发生的事情,我可以尝试找出为什么没有通过这些反应。
答案 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 客户端得到空响应,一些建议: