我正在开发一个使用WCF服务的项目。我已经构建了服务,配置了web.config文件,将其部署在IIS 7服务器上。该服务通过HTTPS加入(在我的开发机器上,我自己创建了证书)。 在Visual Studio 2010中创建ServiceReference时,一切都很好,它创建客户端并且工作正常。
我需要的是以编程方式创建客户端(需要一点灵活性),所以当我尝试“手动”连接时,它会给我一个这样的错误:
提供的URI方案“https”无效;预计'http'。 参数名称:via
web.config的代码是:(我希望它没有任何问题)
<system.serviceModel>
<services>
<service name="WcfService1.Service1" behaviorConfiguration="WcfService1.Service1Behavior">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="TransportSecurity" contract="WcfService1.IService1" />
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WcfService1.Service1Behavior">
<serviceMetadata httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="TransportSecurity">
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
我写的访问WCF服务的过程是:
void proc()
{
string ADRESASSL = "https://localhost/ServiciuSSLwsBind/Service1.svc";
WSHttpBinding bind= new WSHttpBinding();
EndpointAddress ea = new EndpointAddress(ADRESASSL);
var myChannelFactory = new ChannelFactory<IService1>(bind, ea);
IService1 client = null;
try
{
client = myChannelFactory.CreateChannel();
client.RunMethod1();
client.Close();
//((ICommunicationObject)client).Close();
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
if (client != null)
client.Close();
}
}
IService1的代码
[ServiceContract]
public interface IService1 : IClientChannel
{
[OperationContract]
int RunMethod1();
//....................................
}
看来我在这里做错了,程序提出了我提到的Exception。我必须做的更多工作,但我没有想到它。
提前感谢你给我的任何建议。
答案 0 :(得分:3)
我还没有对此进行测试,但我相信您需要在创建工厂之前设置绑定的安全模式。 WSHttpBinding
的默认安全模式为SecurityMode.Message
,您需要SecurityMode.Transport
。
您可以通过以下三种方式之一解决此问题。
首先,您可以使用WSHttpBinding
构造函数的重载版本来指定安全模式,如下所示:
WSHttpBinding bind= new WSHttpBinding(SecurityMode.Transport);
bind.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
其次,您可以使用无参数构造函数并指定安全模式(和客户端凭据类型),如下所示:
WSHttpBinding bind= new WSHttpBinding();
bind.Security.Mode = SecurityMode.Transport;
bind.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
第三,您可以在客户端配置中放置binding
配置部分,并在构造函数中引用该部分,如下所示:
WSHttpBinding bind = new WSHttpBinding("TransportSecurity");
第三个示例假定wsHttpBinding
部分的名称为&#34; TransportSecurity&#34;在客户端配置文件中。
有关详细信息,请查看以下MSDN文章:
答案 1 :(得分:1)
好吧,解决了自创证书的问题。 我在Viosual Studio 2010中更改了编程连接和服务引用的端点地址。
string ADRESASSL = "https://localhost/ServiciuSSLwsBind/Service1.svc";
现在是
string ADRESASSL = "https://eu-pc/ServiciuSSLwsBind/Service1.svc";
我已将地址从localhost更改为pc“eu-pc”的名称。它与颁发证书的域有关。 使用localhost或127.0.0.1仅适用于一种方法或另一种方法。
希望这会有助于其他可能遇到此问题的人。