Note that there are some explanatory texts on larger screens.

plurals
  1. POImpossible to use WSDL definition
    text
    copied!<p>A systematic breakdown of the problem follows. [Rewritten!]</p> <p><strong>The client code</strong></p> <pre><code>using System; using System.Collections.Generic; using System.Linq; using System.Text; // This is a "sanitized" version of the real deal, of course. In reality I also require to // sign all incomming and outgoing messages and com. over SSL. The basic model is the same // though and the sanitized WSDL captures the problem in its minimal form. namespace MissileDefenseSystem { using MissileDefenseSystemServiceReference; class Program { static void Main(string[] args) { try { var client = new TestPortTypeClient(); var req = "just do it"; Console.WriteLine("request&gt;" + req + "&lt;"); var rsp = client.LaunchMissiles(req); Console.WriteLine("response&gt;" + rsp + "&lt;"); } catch (Exception e) { Console.WriteLine("exception&gt;" + e.Message + "&lt;"); Console.WriteLine(e.StackTrace); } } } } </code></pre> <p><strong>The WSDL</strong></p> <pre><code>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt; &lt;definitions targetNamespace="java:bla.bla.bla.bla" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="java:bla.bla.bla.bla" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"&gt; &lt;types&gt; &lt;schema targetNamespace='java:bla.bla.bla.bla' xmlns='http://www.w3.org/2001/XMLSchema'/&gt; &lt;/types&gt; &lt;message name="TestRequest"&gt; &lt;part name="arg0" type="xsd:string"/&gt; &lt;/message&gt; &lt;message name="TestResponse"&gt; &lt;part name="return" type="xsd:string"/&gt; &lt;/message&gt; &lt;portType name="TestPortType"&gt; &lt;operation name="LaunchMissiles"&gt; &lt;input message="tns:TestRequest"/&gt; &lt;output message="tns:TestResponse"/&gt; &lt;/operation&gt; &lt;operation name="AbortMission"&gt; &lt;input message="tns:TestRequest"/&gt; &lt;output message="tns:TestResponse"/&gt; &lt;/operation&gt; &lt;/portType&gt; &lt;binding name="TestBinding" type="tns:TestPortType"&gt; &lt;soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/&gt; &lt;operation name="LaunchMissiles"&gt; &lt;soap:operation soapAction="urn:LaunchMissiles"/&gt; &lt;input&gt; &lt;soap:body use="encoded" namespace='urn:Test' encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/&gt; &lt;/input&gt; &lt;output&gt; &lt;soap:body use="encoded" namespace='urn:Test' encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/&gt; &lt;/output&gt; &lt;/operation&gt; &lt;operation name="AbortMission"&gt; &lt;soap:operation soapAction="urn:AbortMission"/&gt; &lt;input&gt; &lt;soap:body use="encoded" namespace='urn:Test' encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/&gt; &lt;/input&gt; &lt;output&gt; &lt;soap:body use="encoded" namespace='urn:Test' encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/&gt; &lt;/output&gt; &lt;/operation&gt; &lt;/binding&gt; &lt;service name="Test"&gt; &lt;documentation&gt;todo&lt;/documentation&gt; &lt;port name="TestPort" binding="tns:TestBinding"&gt; &lt;soap:address location="https://demo.blablablablablabla.com:123/Bla"/&gt; &lt;/port&gt; &lt;/service&gt; &lt;/definitions&gt; </code></pre> <p><strong>The error trace</strong></p> <pre><code>request&gt;just do it&lt; exception&gt;RPC Message LaunchMissilesRequest in operation AbortMission has an invalid body name LaunchMissiles. It must be AbortMission&lt; at System.ServiceModel.Description.XmlSerializerOperationBehavior.Reflector.OperationReflector.EnsureMessageInfos() at System.ServiceModel.Description.XmlSerializerOperationBehavior.Reflector.EnsureMessageInfos() at System.ServiceModel.Description.XmlSerializerOperationBehavior.Reflector.OperationReflector.get_Request() at System.ServiceModel.Description.XmlSerializerOperationBehavior.CreateFormatter() at System.ServiceModel.Description.XmlSerializerOperationBehavior.System.ServiceModel.Description.IOperationBehavior.ApplyClientBehavior(OperationDescription description, ClientOperation proxy) at System.ServiceModel.Description.DispatcherBuilder.BindOperations(ContractDescription contract, ClientRuntime proxy, DispatchRuntime dispatch) at System.ServiceModel.Description.DispatcherBuilder.ApplyClientBehavior(ServiceEndpoint serviceEndpoint, ClientRuntime clientRuntime) at System.ServiceModel.Description.DispatcherBuilder.BuildProxyBehavior(ServiceEndpoint serviceEndpoint, BindingParameterCollection&amp; parameters) at System.ServiceModel.Channels.ServiceChannelFactory.BuildChannelFactory(ServiceEndpoint serviceEndpoint) at System.ServiceModel.ChannelFactory.CreateFactory() at System.ServiceModel.ChannelFactory.OnOpening() at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) at System.ServiceModel.ChannelFactory.EnsureOpened() at System.ServiceModel.ChannelFactory`1.CreateChannel(EndpointAddress address, Uri via) at System.ServiceModel.ChannelFactory`1.CreateChannel() at System.ServiceModel.ClientBase`1.CreateChannel() at System.ServiceModel.ClientBase`1.CreateChannelInternal() at System.ServiceModel.ClientBase`1.get_Channel() at MissileDefenseSystem.MissileDefenseSystemServiceReference.TestPortTypeClient.MissileDefenseSystem.MissileDefenseSystemServiceReference.TestPortType.LaunchMissiles(LaunchMissilesRequest request) in C:\Users\bra\Documents\Visual Studio 2008\Projects\MissileDefenseSystem\MissileDefenseSystem\Service References\MissileDefenseSystemServiceReference\Reference.cs:line 90 at MissileDefenseSystem.MissileDefenseSystemServiceReference.TestPortTypeClient.LaunchMissiles(String arg0) in C:\Users\bra\Documents\Visual Studio 2008\Projects\MissileDefenseSystem\MissileDefenseSystem\Service References\MissileDefenseSystemServiceReference\Reference.cs:line 96 at MissileDefenseSystem.Program.Main(String[] args) in C:\Users\bra\Documents\Visual Studio 2008\Projects\MissileDefenseSystem\MissileDefenseSystem\Program.cs:line 22 </code></pre> <p>The <strong>generated proxy code</strong> using Visual Studio 2008 (SvcUtil.exe).</p> <pre><code>//------------------------------------------------------------------------------ // &lt;auto-generated&gt; // This code was generated by a tool. // Runtime Version:2.0.50727.3074 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // &lt;/auto-generated&gt; //------------------------------------------------------------------------------ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] [System.ServiceModel.ServiceContractAttribute(Namespace="java:bla.bla.bla.bla", ConfigurationName="TestPortType")] public interface TestPortType { // CODEGEN: Generating message contract since the wrapper namespace (urn:Test) of message LaunchMissilesRequest does not match the default value (java:bla.bla.bla.bla) [System.ServiceModel.OperationContractAttribute(Action="urn:LaunchMissiles", ReplyAction="*")] [System.ServiceModel.XmlSerializerFormatAttribute(Style=System.ServiceModel.OperationFormatStyle.Rpc, Use=System.ServiceModel.OperationFormatUse.Encoded)] LaunchMissilesResponse LaunchMissiles(LaunchMissilesRequest request); // CODEGEN: Generating message contract since the wrapper namespace (urn:Test) of message AbortMissionRequest does not match the default value (java:bla.bla.bla.bla) [System.ServiceModel.OperationContractAttribute(Action="urn:AbortMission", ReplyAction="*")] [System.ServiceModel.XmlSerializerFormatAttribute(Style=System.ServiceModel.OperationFormatStyle.Rpc, Use=System.ServiceModel.OperationFormatUse.Encoded)] LaunchMissilesResponse AbortMission(LaunchMissilesRequest request); } [System.Diagnostics.DebuggerStepThroughAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] [System.ServiceModel.MessageContractAttribute(WrapperName="LaunchMissiles", WrapperNamespace="urn:Test", IsWrapped=true)] public partial class LaunchMissilesRequest { [System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=0)] public string arg0; public LaunchMissilesRequest() { } public LaunchMissilesRequest(string arg0) { this.arg0 = arg0; } } [System.Diagnostics.DebuggerStepThroughAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] [System.ServiceModel.MessageContractAttribute(WrapperName="LaunchMissilesResponse", WrapperNamespace="urn:Test", IsWrapped=true)] public partial class LaunchMissilesResponse { [System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=0)] public string @return; public LaunchMissilesResponse() { } public LaunchMissilesResponse(string @return) { this.@return = @return; } } [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] public interface TestPortTypeChannel : TestPortType, System.ServiceModel.IClientChannel { } [System.Diagnostics.DebuggerStepThroughAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] public partial class TestPortTypeClient : System.ServiceModel.ClientBase&lt;TestPortType&gt;, TestPortType { public TestPortTypeClient() { } public TestPortTypeClient(string endpointConfigurationName) : base(endpointConfigurationName) { } public TestPortTypeClient(string endpointConfigurationName, string remoteAddress) : base(endpointConfigurationName, remoteAddress) { } public TestPortTypeClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : base(endpointConfigurationName, remoteAddress) { } public TestPortTypeClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : base(binding, remoteAddress) { } [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] LaunchMissilesResponse TestPortType.LaunchMissiles(LaunchMissilesRequest request) { return base.Channel.LaunchMissiles(request); } public string LaunchMissiles(string arg0) { LaunchMissilesRequest inValue = new LaunchMissilesRequest(); inValue.arg0 = arg0; LaunchMissilesResponse retVal = ((TestPortType)(this)).LaunchMissiles(inValue); return retVal.@return; } [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] LaunchMissilesResponse TestPortType.AbortMission(LaunchMissilesRequest request) { return base.Channel.AbortMission(request); } public string AbortMission(string arg0) { LaunchMissilesRequest inValue = new LaunchMissilesRequest(); inValue.arg0 = arg0; LaunchMissilesResponse retVal = ((TestPortType)(this)).AbortMission(inValue); return retVal.@return; } } </code></pre> <p>This is using the proxy code generated by <strong>SvcUtil.exe</strong>.</p> <p>Download full Visual Studio project files here:</p> <p><a href="http://dl.getdropbox.com/u/797094/MissileDefenseSystem.zip" rel="nofollow noreferrer">http://dl.getdropbox.com/u/797094/MissileDefenseSystem.zip</a></p> <p>Now, I just tried using the WSDL.exe again. This works better, but now the next problem rears it's ugly head. The app.config for WCF is not used. So I need to configure the proxy class to use a certificate. For WCF I just say</p> <pre><code>&lt;?xml version="1.0" encoding="utf-8" ?&gt; &lt;configuration&gt; &lt;system.serviceModel&gt; &lt;bindings&gt; &lt;basicHttpBinding&gt; &lt;binding name="TestBinding"/&gt; &lt;/basicHttpBinding&gt; &lt;/bindings&gt; &lt;client&gt; &lt;endpoint address="https://demo.blablablablablabla.com:123/Bla" binding="basicHttpBinding" bindingConfiguration="TestBinding" contract="MissileDefenseSystemServiceReference.TestPortType" name="TestPort"&gt; &lt;identity&gt; &lt;certificateReference storeLocation="CurrentUser" x509FindType="FindByThumbprint" findValue="the thumbprint to be used" /&gt; &lt;/identity&gt; &lt;/endpoint&gt; &lt;/client&gt; &lt;/system.serviceModel&gt; &lt;/configuration&gt; </code></pre> <p>OK, now using a piece of code to provide signatures</p> <pre><code> proxy.ClientCertificates.Add(cert); </code></pre> <p>This now almost works, except it can't decode the response.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload