我正在尝试使用自签名SSL在IIS 10上托管WCF服务库。
要获得最低完整可验证示例,请打开Visual Studio 2017
新建>项目> C#> Web> WCFLibrary有了这个,你将得到一个简单的代码,它有一个操作契约,它接受一个整数并返回一个字符串。
现在我试图在IIS上使用自签名SSL来托管它(我有更多的操作合同,但这样做)。
到目前为止我尝试过的。
现在下一部分是在IIS上托管它,所以我创建了SVC文件
我的SVC文件包含 - >
<%@ ServiceHost Language = "C#" Debug = "true" Service = "WcfServiceLibrary2.Service1" %>
然后我可以找到的所有教程编辑Web.Config,这在Visual Studio 2017中不可用,所以我尝试了两件事1.创建了一个Web.Config文件并添加了配置2.发布了网站然后获得了Web.Config不需要任何改变
然后我继续使用IIS(作为管理员)并添加了一个新网站
然后在尝试浏览时,看到IIS服务托管的消息我收到此错误“无法读取配置文件”要解决这个问题,我遵循了success.trendmicro.com/...
现在这个错误消失了,但现在我得到了
为了解决这个问题,我跟着IIS - 401.3 - Unauthorized但是这导致浏览器让我浏览目录而不是给出已创建服务的消息。
知道我在这里缺少什么吗?
我肯定错过了一些主要的东西,因为我没有在HTTP本身上托管它,我在网上找到的所有教程都有一个文件Web.Config而不是App.config,我正在寻找一个示例(最好用图片)来演示它只是用这个小例子。
我知道这并没有遵循所有提出问题的SO准则,但我没有将其表达为一个问题。
编辑
根据LexLi的建议,它可能已经托管,我去尝试使用svcutil消耗它,这给了我错误
WS-Metadata Exchange Error
URI: http://localhost/Service1.svc
Metadata contains a reference that cannot be resolved: 'http://localhost/Service1.svc'.
The remote server returned an unexpected response: (405) Method Not Allowed.
The remote server returned an error: (405) Method Not Allowed.
HTTP GET Error
URI: http://localhost/Service1.svc
There was an error downloading 'http://localhost/Service1.svc'.
The request failed with HTTP status 404: Not Found.
Url是正确的,因为我是通过使用IIS的浏览功能获得的。
首先,请不要将IIS物理路径设置为桌面,这将导致权限问题。我们可以设置IIS站点物理路径到C分区下的文件夹。 其次,请阅读以下链接,主要表明WCF服务库项目无法直接发布到IIS,因为除非在网站的根目录中手动添加其他Webconfig,否则IIS无法识别其Appconfig。 https://docs.microsoft.com/en-us/dotnet/framework/wcf/deploying-a-wcf-library-project 一般来说,我们使用WCF服务项目模板,该模板包含自动生成的Webconfig文件而不是WCF服务库项目模板,因为它通常用作类库。 默认情况下,该服务使用BasicHttpBinding进行托管,它取决于以下标记。
<protocolMapping>
<add binding="basicHttpBinding" scheme="http" />
</protocolMapping>
也可以通过以下方式手动配置服务。这两种方式的配置文件是等效的。
<system.serviceModel>
<services>
<service name="WcfService1.Service1" behaviorConfiguration="mybehavior">
<endpoint address="" binding="basicHttpBinding" contract="WcfService1.IService1" bindingConfiguration="mybinding"></endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="mybinding">
<security mode="None">
</security>
</binding>
</basicHttpBinding>
</bindings>
无需在webconfig中分配服务端点地址。它应该在IIS站点绑定模块中完成。 WCF System.ServiceModel.EndpointNotFoundException 最后,我们可以通过添加额外的服务端点来通过https托管服务,请参阅以下配置(简化配置)。
<protocolMapping>
<add binding="basicHttpBinding" scheme="http"/>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
然后在IIS站点绑定模块中添加https协议。 Configuring Web.config to publish WCF Service https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-configure-an-iis-hosted-wcf-service-with-ssl 如果有什么我可以帮忙,请随时告诉我。
总之,这里是步骤:
信用到期的第一信用,我被多个SO用户指向正确方向的许多问题仅举几例:Mikael bolinder,Abraham Qian,Lex Li,C# chat room的优秀人才和我的同事(Doesn)在撰写此答案时,我们没有关于SO的帐户,在这个答案中,我计划涵盖使用HTTPS安全性在IIS服务器中托管WCF库所需的一切。
我用过的工具:
第一:确保安装了visual studio所需的所有组件。
在此列表以及将要出现的其他列表中,可能包含一些额外组件,原因是我安装了它们,如果绝对必要,则无法验证这种方式或另一种方式。
现在,让我们添加必要的Windows功能。控制面板 - >程序 - >打开或关闭Windows功能
确保进入WCF服务并检查HTTP激活,不要被方块愚弄(我的一个错误)
现在让我们来创建服务。打开Visual Studio文件 - >新建 - >项目 - > Visual C# - > Web - > WCF - > WCF服务库这将生成您尝试托管的MCVE
现在您必须将其与网站链接以生成Web.Config文件以及SVC文件,为此,在解决方案资源管理器上,右键单击您的解决方案,添加 - >新网站。
现在在web.config文件中添加
<system.serviceModel>
<services>
<service name="WcfServiceLibrary4.Service1"> <!-- Change the library name as per your need -->
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="secureHttpBinding"
contract="WcfServiceLibrary4.IService1"/> <!-- Change the library name as per your need -->
<endpoint address="mex"
binding="mexHttpsBinding"
contract="IMetadataExchange" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="secureHttpBinding">
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpsGetEnabled="true"/>
<!-- 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="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
接下来在网站上添加对服务的引用
发现服务并添加您创建的服务。现在构建您的解决方案并发布它。 **小心不要在桌面或文档等用户目录中发布解决方案,否则ACL权限会让您头痛,而是直接将其发布到Drive中的目录中。
现在托管时间首先让我们打开IIS(始终作为管理员)并创建一个新证书。
在服务器上,转到IIS部件并选择“服务器证书”,然后单击右侧的“创建新证书”。
现在从左侧菜单创建一个新网站
确保切换到https并在此处选择您的证书,现在要验证您的服务是否已创建,您将需要浏览您的网站创建的svc文件,遗憾的是,此时您将收到错误说Server Error in '/' Application.
Could not find a base address that matches scheme http for the endpoint with binding BasicHttpBinding. Registered base address schemes are [https].
我无法找到原因错误,但我能够找到它的旁路,
绕过此错误的步骤 - >从左侧菜单中选择您的网站,在右键单击绑定的菜单上选择您的网站,并添加一个HTTP绑定,使用不同的端口。在此之后,您将能够浏览svc文件的HTTPS版本。
现在,如果您浏览HTTPS链接,则会收到创建服务的消息
现在,您可以继续前进并创建一个使用此服务的应用程序。
什么样的未来
如果我实现了这些,我会更新,但是这些不是我现在的优先事项,可能不会添加很长一段时间,如果有任何意义没有意义,或者你有任何改进意见如下。