Reputation: 1470
I have a WCF service run by IIS. I would like to create two different clients (WPF and WP7), that are using the same service. The WPF client was already working with an endpoint using wsHttpBinding
and https
. Sadly WP7 doesn't do wsHttpBinding
, only BasicHttpBinding
. So I thought I would expose different endpoints for the two, so they could access the same service, but with different bindings and what not...
So here is my Web.config on IIS:
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="TransportSecurity">
<reliableSession enabled="true" />
<security mode="TransportWithMessageCredential" >
<transport clientCredentialType="None"/>
</security>
</binding>
</wsHttpBinding>
<basicHttpBinding>
<binding name="BasicTransportSecurity">
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="SmartCook2.Server.ISmartCookServiceBehavior">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
<services>
<service behaviorConfiguration="SmartCook2.Server.ISmartCookServiceBehavior"
name="SmartCook2.Server.SmartCookService">
<endpoint address="WS" binding="wsHttpBinding" bindingConfiguration="TransportSecurity"
name="WS" contract="SmartCook2.Server.ISmartCookService" />
<endpoint address="Basic" binding="basicHttpBinding" bindingConfiguration="BasicTransportSecurity"
name="Basic" contract="SmartCook2.Server.ISmartCookService" />
<endpoint address="mex" binding="mexHttpsBinding" name="mex"
contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
<connectionStrings>
<add name="SmartCookDBEntities" connectionString="metadata=res://*/SmartCookContext.csdl|res://*/SmartCookContext.ssdl|res://*/SmartCookContext.msl;provider=System.Data.SqlClient;provider connection string="data source=RENDERBETYAR;initial catalog=SmartCookDB;integrated security=True;pooling=False;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>
Now if I got it right the endpoints should be accessible on the following addresses:
https://localhost/IISHostedSmartCook/SmartCookService.svc/Basic
https://localhost/IISHostedSmartCook/SmartCookService.svc/WS
https://localhost/IISHostedSmartCook/SmartCookService.svc/mex
If I check them in my browser I get nothing. There's no exception, but no content either. Using the base address (till the .svc part) I get the default service page and I can access the wsdl and it is valid. It has the endpoints, my service's methods etc correctly as far as I can tell.
If I try to add the ServiceReference to my WP7 project is Visual Studio, I can only see my service under the base address (specific endpoint addresses return nothing). If I add it, the classes are generated about right, only I can't call any of my service's methods and I get the error message "There is no endpoint listening at this address". (This also happens if I use the service client's constructor requiring the endpoint's name.)
What am I doing wrong?
Upvotes: 13
Views: 14358
Reputation: 1
Answered here: WCF: Multiple binding configurations for a single service
Basically you can't have different bindings at the same URI as mentioned Here
You can have different binding configurations in the same binding though.
Upvotes: 0
Reputation: 9784
Check here for detailed explanation.
What you will need to specify is the address like so in your endpoints
:
<service behaviorConfiguration="SmartCook2.Server.ISmartCookServiceBehavior"
name="SmartCook2.Server.SmartCookService">
<endpoint address="http://localhost/Service.svc/WS" binding="wsHttpBinding" bindingConfiguration="TransportSecurity"
name="WS" contract="SmartCook2.Server.ISmartCookService" />
<endpoint address="http://localhost/Service.svc/Basic" binding="basicHttpBinding" bindingConfiguration="BasicTransportSecurity"
name="Basic" contract="SmartCook2.Server.ISmartCookService" />
<endpoint address="" binding="mexHttpsBinding" name="mex"
contract="IMetadataExchange" />
</service>
Upvotes: 2
Reputation: 7876
All your configuration is correct and if you inspect your wsdl the SOAP:address attribute would have the locations as specified by you i.e:
https://localhost/IISHostedSmartCook/SmartCookService.svc/Basic
https://localhost/IISHostedSmartCook/SmartCookService.svc/WS
https://localhost/IISHostedSmartCook/SmartCookService.svc/mex
When you add a reference in your projects you just need to use the appropriate endpoint which you want i.e. if you want to use basicHttpBinding then use that endpoint which has its address as
https://localhost/IISHostedSmartCook/SmartCookService.svc/Basic
When you browse to these addresses in IE you would not see anything which is absolutely correct. To make it more sensibile replace localhost with your machine name which should be visible on the network you are in so that the services are accessible across the network.
Also try to build a .NET client to invoke the service and make sure your services are working perfectly.
Upvotes: 1
Reputation: 2184
<services>
...
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="https://localhost/IISHostedSmartCook/SmartCookService.svc"/>
</baseAddresses>
</host>
</service>
</services>
...
Upvotes: 1
Reputation: 44931
I believe that you may need to change your end point addresses to be relative locations:
<endpoint address="/WS"
and
<endpoint address="/Basic"
The mex address is a special case, so shouldn't need to be changed.
See the MSDN documentation Specifying an Endpoint Address for more details.
Upvotes: 0