Interacting with the Dynamics CRM Web Service through WCF
Before I could get started on LinqtoCRM, I had to get Visual Studio 2008/WCF and CRM to agree on a common mode of interaction. I must confess that, in the past, I’ve only picked up just enough web services knowledge to get things humming (which was almost nothing in VS 2003/2005). WCF, with its notions of “endpoints” and other newfangled stuff, seems a bit more configuration heavy. Here’s what I did to get it to work. In “app.config”, you need this:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="CrmServiceSoap" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="100000000" maxBufferPoolSize="100000000" maxReceivedMessageSize="100000000" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> <readerQuotas maxDepth="32" maxStringContentLength="100000000" maxArrayLength="100000000" maxBytesPerRead="4096" maxNameTableCharCount="100000000" /> <security mode="TransportCredentialOnly"> <transport clientCredentialType="Windows" /> </security> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="http://foo/MSCRMServices/2006/CrmService.asmx" binding="basicHttpBinding" bindingConfiguration="CrmServiceSoap" contract="ServiceReference.CrmServiceSoap" name="CrmServiceSoap" /> </client> </system.serviceModel> </configuration>
And in code, do something like this:
CrmServiceSoapClient client = new CrmServiceSoapClient(); client.ClientCredentials.Windows.ClientCredential.Domain = "foo"; client.ClientCredentials.Windows.ClientCredential.UserName = "bar"; client.ClientCredentials.Windows.ClientCredential.Password = "foo"; client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
Addendum: I just noticed that Visual Studio still lets you create a traditional web reference (as opposed to a service reference). This may be a lower friction approach: