两个地址上的一个WCF服务

时间:2015-05-29 06:55:47

标签: c# wcf

我的情况:

我在地址http://0.0.0.0:10004/Service.svc上有一个WCF服务。使用Interface_1Service_1_ClassServiceHost_1_Class

现在我需要授权的第二版本服务。使用https://0.0.0.0:10004/Service2.svcInterface_1Service_1_Class选择地址ServiceHost_2_Class

得到错误 HTTP无法注册URL https://+:10004/Service2.svc/。另一个应用程序已经使用HTTP.SYS注册了此URL。

如果复制粘贴并使用Interface_2Service_2_ClassServiceHost_2_Class(具有不同名称的相同类别),一切正常。

不是大问题,但想知道:如何在两个地址上绑定相同的服务类?我可以错过哪一步?即绑定一对一工作,绑定一到两个 - 不,哪里有区别?如果不存在差异(即代码中的问题),我将结束这个问题。

PS:对不起,邮政编码:太大,太复杂,不清楚。问题不是代码,而是概念

1 个答案:

答案 0 :(得分:0)

根据建议,您需要设置多个服务端点,每个服务端点具有不同的绑定。一个绑定没有启用安全性,另一个绑定启用了安全性。

以下是如何在两个不同端点托管相同服务的工作示例。一个端点根本没有安全性,另一个端点提供基于HTTP的客户端身份验证。

var baseUri = new Uri("http://localhost:10004/");
var serviceHost = new ServiceHost(typeof(HelloWorldService), baseUri);
try
{
    var unsecureServiceEndpoint = serviceHost.AddServiceEndpoint(typeof(IHelloWorldService), new WebHttpBinding(), "Service.svc");
    unsecureServiceEndpoint.Behaviors.Add(new WebHttpBehavior());
    unsecureServiceEndpoint.Name = "UnsecureEndpoint";

    var secureBinding = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly);
    secureBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
    var secureServiceEndpoint = serviceHost.AddServiceEndpoint(typeof(IHelloWorldService), secureBinding, "Service2.svc");
    secureServiceEndpoint.Behaviors.Add(new WebHttpBehavior());
    secureServiceEndpoint.Name = "SecureEndpoint";

    serviceHost.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
    serviceHost.Open();

    Console.WriteLine("Hosting - {0} @ {1}", unsecureServiceEndpoint.Name, unsecureServiceEndpoint.Address);
    Console.WriteLine("Hosting - {0} @ {1}", secureServiceEndpoint.Name, secureServiceEndpoint.Address);

    Console.WriteLine("Press <Enter> to stop the services.");
    Console.ReadLine();

    serviceHost.Close();
}
catch (CommunicationException ce)
{
    Console.WriteLine("An exception occurred: {0}", ce.Message);
    serviceHost.Abort();
}