我正在尝试通过basicHttpBinding创建一个WCF服务,以便在https上使用。这是我的web.config:
<!-- language: xml -->
<service behaviorConfiguration="MyServices.PingResultServiceBehavior"
name="MyServices.PingResultService">
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration="defaultBasicHttpBinding"
contract="MyServices.IPingResultService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
...
<bindings>
<basicHttpBinding>
<binding name="defaultBasicHttpBinding">
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
...
<behaviors>
<serviceBehaviors>
<behavior name="MyServices.UpdateServiceBehavior">
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
我正在使用能够正确检索所有元数据的WCFStorm进行连接,但是当我调用实际方法时,我得到了:
提供的URI方案“https”无效;预计'http'。 参数名称:via
答案 0 :(得分:224)
尝试在app.config上添加邮件凭据,例如:
<bindings>
<basicHttpBinding>
<binding name="defaultBasicHttpBinding">
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
<message clientCredentialType="Certificate" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
答案 1 :(得分:51)
添加此作为答案,因为你不能在评论中做很多花哨的格式化 我有同样的问题,除了我在代码中完全创建和绑定我的Web服务客户端 原因是DLL被上传到系统中,禁止使用配置文件。
以下是需要更新以通过SSL进行通信的代码...
Public Function GetWebserviceClient() As WebWorker.workerSoapClient
Dim binding = New BasicHttpBinding()
binding.Name = "WebWorkerSoap"
binding.CloseTimeout = TimeSpan.FromMinutes(1)
binding.OpenTimeout = TimeSpan.FromMinutes(1)
binding.ReceiveTimeout = TimeSpan.FromMinutes(10)
binding.SendTimeout = TimeSpan.FromMinutes(1)
'// HERE'S THE IMPORTANT BIT FOR SSL
binding.Security.Mode = BasicHttpSecurityMode.Transport
Dim endpoint = New EndpointAddress("https://myurl/worker.asmx")
Return New WebWorker.workerSoapClient(binding, endpoint)
End Function
答案 2 :(得分:29)
您是在Cassini(vs dev服务器)上运行此程序还是在安装了证书的IIS上运行此程序?我过去曾尝试在开发Web服务器上连接安全端点。
这是过去对我有用的绑定配置。它使用basicHttpBinding
而不是wsHttpBinding
。我不知道这对你来说是否有问题。
<!-- Binding settings for HTTPS endpoint -->
<binding name="WsSecured">
<security mode="Transport">
<transport clientCredentialType="None" />
<message clientCredentialType="None"
negotiateServiceCredential="false"
establishSecurityContext="false" />
</security>
</binding>
和端点
<endpoint address="..." binding="wsHttpBinding"
bindingConfiguration="WsSecured" contract="IYourContract" />
另外,请确保更改客户端配置以启用传输安全性。
答案 3 :(得分:27)
更改 来自
<security mode="None">
到
<security mode="Transport">
在您的web.config文件中。此更改将允许您使用https而不是http
答案 4 :(得分:20)
我和OP有同样的问题。我的配置和情况完全相同。在Visual Studio中的测试项目中创建服务引用并确认该服务正在运行后,我最终将其缩小为WCFStorm中的问题。在Storm中,您需要单击“配置”设置选项(而不是“客户端配置”)。单击后,单击弹出对话框中的“安全”选项卡。确保“身份验证类型”设置为“无”(默认为“Windows身份验证”)。 Presto,它的作品!我总是在WCFStorm中测试我的方法,因为我正在构建它们,但从未尝试使用它来连接已经在SSL上设置的方法。希望这有助于某人!
答案 5 :(得分:16)
我在custom binding
场景中遇到了同样的异常。使用这种方法的任何人都可以检查这一点。
我实际上是从local WSDL
文件添加服务引用。它已成功添加,并且需要将自定义绑定添加到配置文件中。但是,实际的服务是https;不是http。所以我将httpTransport elemet更改为httpsTransport
。这解决了问题
<system.serviceModel>
<bindings>
<customBinding>
<binding name="MyBindingConfig">
<textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
messageVersion="Soap11" writeEncoding="utf-8">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</textMessageEncoding>
<!--Manually changed httpTransport to httpsTransport-->
<httpsTransport manualAddressing="false" maxBufferPoolSize="524288"
maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous"
bypassProxyOnLocal="false"
decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
keepAliveEnabled="true" maxBufferSize="65536"
proxyAuthenticationScheme="Anonymous"
realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
useDefaultWebProxy="true" />
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="https://mainservices-certint.mycompany.com/Services/HRTest"
binding="customBinding" bindingConfiguration="MyBindingConfig"
contract="HRTest.TestWebserviceManagerImpl" name="TestWebserviceManagerImpl" />
</client>
</system.serviceModel>
参考
答案 6 :(得分:11)
遇到同样的问题,这就是我的解决方案最终结果:
<basicHttpsBinding>
<binding name="VerificationServicesPasswordBinding">
<security mode="Transport">
</security>
</binding>
<binding name="VerificationServicesPasswordBinding1" />
</basicHttpsBinding>
我基本上用Https替换了每次出现的Http。如果您愿意,可以尝试添加它们。
答案 7 :(得分:5)
如果以编程方式执行此操作,而不是在web.config中执行此操作:
new WebHttpBinding(WebHttpSecurityMode.Transport)
答案 8 :(得分:3)
值得记住的是,配置文件可以跨辅助文件拆分,以便在不同的服务器(开发/演示/生产等)上更轻松地进行配置更改,而无需重新编译代码/应用程序等。 例如,我们使用它们来允许现场工程师进行端点更改,而无需实际触及“真实”工具。文件。
第一步是将绑定部分从WPF App.Config中移出到它自己的单独文件中。
行为部分设置为允许http和https(如果两者都允许,似乎不会对应用产生影响)
<serviceMetadata httpsGetEnabled="true" httpGetEnabled="true" />
我们将绑定部分移到自己的文件中;
<bindings configSource="Bindings.config" />
在bindings.config文件中,我们根据协议
切换安全性 <!-- None = http:// -->
<!-- Transport = https:// -->
<security mode="None" >
现在,现场工程师只需要更改Bindings.Config文件和Client.Config,我们存储每个端点的实际URL。
这样我们可以将端点从http更改为https,然后再返回以测试应用,而无需更改任何代码。
希望这有帮助。
答案 9 :(得分:2)
重新限制OP中的问题:
我使用WCFStorm连接[WCF服务],它可以正确检索所有元数据,但当我调用实际方法时,我得到:
提供的URI方案“https”无效;预计'http'。参数名称:via
WCFStorm教程在Working with IIS and SSL中解决了这个问题。
他们的解决方案对我有用:
要修复错误,请生成与wcf服务配置匹配的客户端配置。最简单的方法是使用Visual Studio。
打开Visual Studio并向服务添加服务引用。 VS将生成与服务匹配的app.config文件
编辑app.config文件,以便WCFStorm可以读取该文件。请参阅Loading Client App.config files。确保endpoint / @ name和endpoint / @ contract属性与wcfstorm中的值匹配。
将修改后的app.config加载到WCFStorm [使用Client Config toobar按钮]。
- 醇>
调用方法。这次方法调用将不再失败
项目(1)生效的最后一个子弹意味着删除VS前缀为端点契约属性的命名空间前缀,默认情况下为“ServiceReference1”
<endpoint ... contract="ServiceReference1.ListsService" ... />
所以在您加载到WCFStorm的app.config中需要ListsService:
<endpoint ... contract="ListsService" ... />
答案 10 :(得分:2)
我需要以下绑定才能让我的工作:
<binding name="SI_PurchaseRequisition_ISBindingSSL">
<security mode="Transport">
<transport clientCredentialType="Basic" proxyCredentialType="None" realm="" />
</security>
</binding>
答案 11 :(得分:1)
wsHttpBinding是一个问题,因为silverlight不支持它!
答案 12 :(得分:0)
我通过Visual Studio向我们的项目中添加了一个“连接服务”,该服务生成了创建客户端的默认方法。
var client = new MyWebService.Client(MyWebService.Client.EndpointConfiguration.MyPort, _endpointUrl);
此构造函数继承ClientBase,并在扫描程序的背后通过使用自己的方法Client.GetBindingForEndpoint(endpointConfiguration)创建Binding。
public Client(EndpointConfiguration endpointConfiguration, string remoteAddress) :
base(Client.GetBindingForEndpoint(endpointConfiguration),
new System.ServiceModel.EndpointAddress(remoteAddress))
此方法对https服务和http服务具有不同的设置。 如果要从http获取数据,则应使用 TransportCredentialOnly :
System.ServiceModel.BasicHttpBinding result = new System.ServiceModel.BasicHttpBinding();
result.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.TransportCredentialOnly;
对于https,您应该使用 Transport :
result.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.Transport;
答案 13 :(得分:0)
<!-- Binding settings for HTTPS endpoint -->
<binding name="yourServiceName">
<security mode="Transport">
<transport clientCredentialType="None" />
<!-- Don't use message -->
</security>
</binding>
答案 14 :(得分:0)
我的解决方案遇到了同样的错误消息,比上面的解决方案还要简单,我只是将了更新为basicHttpsBinding>
<bindings>
<basicHttpsBinding>
<binding name="ShipServiceSoap" maxBufferPoolSize="512000" maxReceivedMessageSize="512000" />
</basicHttpsBinding>
</bindings>
与以下部分相同:
<client>
<endpoint address="https://s.asmx" binding="basicHttpsBinding" bindingConfiguration="ShipServiceSoap" contract="..ServiceSoap" name="ShipServiceSoap" />
</client>
答案 15 :(得分:0)
FWIW 如果您在向调用 https 服务的应用程序添加服务引用时不小心,可能会发生此错误
例如,如果您删除了以前的服务引用(以前是 http://example.com/Service.svc),然后重新创建它,现在它是 https://example.com/service.svc。
如果在重新创建服务引用之前不小心删除 web.config 中的旧客户端和绑定,它将创建 BasicHttpBinding_IService1 而不是 BasicHttpBinding_IService。然后,当您将应用程序部署到实际服务器时,它会说“https 是无效的预期 http”,因为它不再寻找 BasicHttpBinding_IService1 而不是 BasicHttpBinding_IService。
与此同时,您正在尝试上述所有建议,但没有结果。
只是想我会把它扔掉。
答案 16 :(得分:0)
就我在 web.config 中的情况而言,我必须在端点定义中将 binding="basicHttpsBinding" 更改为 binding="basicHttpBinding" 并将相关 bindingConfiguration 复制到 basicHttpBinding 部分