Can I have a WCF Service Project that has both HTTP (basic http binding) and HTTPS (basic开发者_运维知识库 http binding) bindings? For example, I would have:
https://localhost:44303/ServiceA.svc http://localhost:12345/ServiceB.svc
Would there be any benefit to putting them into separate service projects (and separate sites when we deploy the app)?
If you already have HTTP binding, you don't need to change code to add HTTPS binding. This is a big advantage of WCF. Instead of adding a separate site, you just add a new endpoint to the configuration file.
Below is an example of configuration with both HTTP and HTTPS.
You can see that there two named bindings: notSecureBinding and secureBinding, which correspond to HTTP and HTTPS.
<bindings>
<basicHttpBinding>
<binding name="notSecureBinding"
maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647">
<security mode="None"/>
</binding>
<binding name="secureBinding"
maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647">
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="StandardServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceAuthorization principalPermissionMode="None"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="StandardServiceBehavior"
name="ServiceName">
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration="notSecureBinding"
contract="Namespace.IService"/>
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration="secureBinding"
contract="Namespace.IService"/>
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"/>
</service>
</services>
I attempted this and when I try to consume my secure service I get the following error:
The HTML document does not contain Web service discovery information. Metadata contains a reference that cannot be resolved: 'https://localhost:44304/ExternalOrderProcessing.svc'. There was no endpoint listening at https://localhost:44304/ExternalOrderProcessing.svc that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details. The remote server returned an error: (404) Not Found.If the service is defined in the current solution, try building the solution and adding the service reference again.
When I try to consume my unsecure service I get the following error:
The HTML document does not contain Web service discovery information. Metadata contains a reference that cannot be resolved: 'http://localhost:5000/LegacyOrderProcessing.svc'. Content Type application/soap+xml; charset=utf-8 was not supported by service http://localhost:5000/LegacyOrderProcessing.svc. The client and service bindings may be mismatched. The remote server returned an error: (415) Cannot process the message because the content type 'application/soap+xml; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'.. If the service is defined in the current solution, try building the solution and adding the service reference again.
I am running this in IIS Express. I have setup the project to allow SSL. My config is as follows:
<services>
<service name="ExternalOrderProcessing" behaviorConfiguration="SecureBehavior">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBindingSecure" contract="IExternalOrderProcessing" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
<service name="LegacyOrderProcessing" behaviorConfiguration="UnsecureBehavior">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding" contract="ILegacyOrderProcessing" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="SecureBehavior">
<serviceMetadata httpsGetEnabled="true" httpsGetUrl=""/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceCredentials>
<serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
<clientCertificate>
<authentication certificateValidationMode="None" />
</clientCertificate>
</serviceCredentials>
</behavior>
<behavior name="UnsecureBehavior">
<serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<!-- Used by external order processing service -->
<binding name="BasicHttpBindingSecure"
hostNameComparisonMode="StrongWildcard"
maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647"
receiveTimeout="00:05:00"
sendTimeout="00:05:00"
openTimeout="00:05:00"
closeTimeout="00:05:00">
<readerQuotas maxArrayLength="2147483647"/>
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="Certificate" proxyCredentialType="None" realm="" />
<message clientCredentialType="Certificate" algorithmSuite="Default" />
</security>
</binding>
<!-- Used to create binding to internal order processing service -->
<binding name="BasicHttpBinding"
hostNameComparisonMode="StrongWildcard"
maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647"
receiveTimeout="00:05:00"
sendTimeout="00:05:00"
openTimeout="00:05:00"
closeTimeout="00:05:00">
<readerQuotas maxArrayLength="2147483647"/>
<security mode="None" />
</binding>
</basicHttpBinding>
</bindings>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
If I put the services into two separate projects, it works. When I do that, I omit the services section in the config and remove the name="BasicHttpBindingSecure" and name="SecureBehavior".
精彩评论