使用SSL加密在IIS 10上托管WCF服务库

问题描述 投票:1回答:3

我正在尝试使用自签名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/...

现在这个错误消失了,但现在我得到了

Forbidden Error

为了解决这个问题,我跟着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的浏览功能获得的。

c# asp.net wcf iis
3个回答
1
投票

首先,请不要将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服务库项目模板,因为它通常用作类库。 enter image description here 默认情况下,该服务使用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 如果有什么我可以帮忙,请随时告诉我。


0
投票

总之,这里是步骤:

  1. 创建自签名证书 添加SSL绑定 为SSL配置虚拟目录 为HTTP传输安全性配置WCF服务

这个链接更深入:https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-configure-an-iis-hosted-wcf-service-with-ssl


0
投票

信用到期的第一信用,我被多个SO用户指向正确方向的许多问题仅举几例:Mikael bolinderAbraham QianLex LiC# chat room的优秀人才和我的同事(Doesn)在撰写此答案时,我们没有关于SO的帐户,在这个答案中,我计划涵盖使用HTTPS安全性在IIS服务器中托管WCF库所需的一切。

我用过的工具:

  • Visual Studio 2017专业版
  • IIS 10(附带Windows 10,但必须在Windows功能中激活)(见下文)

第一:确保安装了visual studio所需的所有组件。

  1. Windows - > .Net桌面开发
  2. Windows - >通用Windows平台开发
  3. Web和云 - > ASP.NET和Web开发

在此列表以及将要出现的其他列表中,可能包含一些额外组件,原因是我安装了它们,如果绝对必要,则无法验证这种方式或另一种方式。

现在,让我们添加必要的Windows功能。控制面板 - >程序 - >打开或关闭Windows功能

Windows Features necessary

确保进入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>

接下来在网站上添加对服务的引用

Adding Reference

发现服务并添加您创建的服务。现在构建您的解决方案并发布它。 **小心不要在桌面或文档等用户目录中发布解决方案,否则ACL权限会让您头痛,而是直接将其发布到Drive中的目录中。

现在托管时间首先让我们打开IIS(始终作为管理员)并创建一个新证书。

在服务器上,转到IIS部件并选择“服务器证书”,然后单击右侧的“创建新证书”。

Create Certificate

现在从左侧菜单创建一个新网站

Create website

Choose website options

确保切换到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版本。

Adding Binding

现在,如果您浏览HTTPS链接,则会收到创建服务的消息

Service created

现在,您可以继续前进并创建一个使用此服务的应用程序。

什么样的未来

  1. 我会尝试找到一种方法来做到这一点,而无需添加额外的绑定
  2. 第二个目标是在不添加额外网站的情况下实现这一目标。

如果我实现了这些,我会更新,但是这些不是我现在的优先事项,可能不会添加很长一段时间,如果有任何意义没有意义,或者你有任何改进意见如下。

© www.soinside.com 2019 - 2024. All rights reserved.