I had a problem at work today that I’d previously solved, almost exactly a year ago. The project I was working on then got almost completely rewritten, so the current version of that code doesn’t have any reference to calling WCF web services at all. I kind of remembered that I’d written up a blog post about it, but couldn’t find it, since I was searching for SOAP instead of WCF. So I’m writing a new blog entry, with “SOAP” in the title, so if I have the same problem again, and I search for “SOAP” again, I’ll at least find this post, with a reference to the previous post. (Having a blog comes in handy, when your present-day self has to solve a problem that your past self has solved, but forgotten about…)
I don’t really have anything to add to that previous post. One thing I will do, though, is post the actual code here, rather than just embed a gist, since I now have a syntax highlighting solution that won’t garble it the way the previous setup did.
// https://gist.github.com/andyhuey/d67f78f6568548f66aabd20eadff8acf // old way: public async Task RunAsync() { CallContext context = new CallContext(); context.Company = "axcompany"; string pingResp = string.Empty; var client = new XYZPurchInfoServiceClient(); var rv = await client.wsPingAsync(context); pingResp = rv.response; Console.WriteLine("Ping response: {0}", pingResp); } /* app.config: <system.serviceModel> <bindings> <netTcpBinding> <binding name="NetTcpBinding_XYZPurchInfoService" /> </netTcpBinding> </bindings> <client> <endpoint address="net.tcp://myserver:8201/DynamicsAx/Services/XYZPurchInfoServices" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_XYZPurchInfoService" contract="XYZPurchInfoSvcRef.XYZPurchInfoService" name="NetTcpBinding_XYZPurchInfoService"> <identity> <userPrincipalName value="myservice@corp.local" /> </identity> </endpoint> </client> </system.serviceModel> */ // new way: CallContext context = new CallContext(); context.Company = "axcompany"; string pingResp = string.Empty; var client = new XYZPurchInfoServiceClient(GetBinding(), GetEndpointAddr()); var rv = await client.wsPingAsync(context); pingResp = rv.response; Console.WriteLine("Ping response: {0}", pingResp); private NetTcpBinding GetBinding() { var netTcpBinding = new NetTcpBinding(); netTcpBinding.Name = "NetTcpBinding_XYZPurchInfoService"; netTcpBinding.MaxBufferSize = int.MaxValue; netTcpBinding.MaxReceivedMessageSize = int.MaxValue; return netTcpBinding; } private EndpointAddress GetEndpointAddr() { string url = "net.tcp://myserver:8201/DynamicsAx/Services/XYZPurchInfoServices"; string user = "myservice@corp.local"; var uri = new Uri(url); var epid = new UpnEndpointIdentity(user); var addrHdrs = new AddressHeader[0]; var endpointAddr = new EndpointAddress(uri, epid, addrHdrs); return endpointAddr; }
Thank you so much! This was very helpful.