• .Net WCF服务部署IIS详细解析


      官方解析:Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTPFTP的相关技术。

    一、WCF服务的创建

    第一步:创建WCF项目

     创建完成之后,自动帮我们生成这些文件,2个类,一个接口,一个接口的实现,还有一个App.config配置文件(WCF具体的配置信息都在这个目录下)

     IService1.cs

    注:等会将WCF发布到IIS上涉及到网络传输,将对象持久化写到磁盘上,那么我们就需要序列化,实体类、自定义属性、类名上打上相应的标签

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Runtime.Serialization;
     5 using System.ServiceModel;
     6 using System.Text;
     7 
     8 namespace WCFDemo
     9 {
    10     // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。
    11     [ServiceContract]
    12     public interface IService1
    13     {
    14         [OperationContract]
    15         string GetData(int value);
    16 
    17         [OperationContract]
    18         CompositeType GetDataUsingDataContract(CompositeType composite);
    19 
    20         // TODO: 在此添加您的服务操作
    21     }
    22 
    23     // 使用下面示例中说明的数据约定将复合类型添加到服务操作。
    24     // 可以将 XSD 文件添加到项目中。在生成项目后,可以通过命名空间“WCFDemo.ContractType”直接使用其中定义的数据类型。
    25     [DataContract]
    26     public class CompositeType
    27     {
    28         bool boolValue = true;
    29         string stringValue = "Hello ";
    30 
    31         [DataMember]
    32         public bool BoolValue
    33         {
    34             get { return boolValue; }
    35             set { boolValue = value; }
    36         }
    37 
    38         [DataMember]
    39         public string StringValue
    40         {
    41             get { return stringValue; }
    42             set { stringValue = value; }
    43         }
    44     }
    45 }

    Service1.cs

    注:具体接口实现

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Runtime.Serialization;
     5 using System.ServiceModel;
     6 using System.Text;
     7 
     8 namespace WCFDemo
     9 {
    10     // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Service1”。
    11     public class Service1 : IService1
    12     {
    13         public string GetData(int value)
    14         {
    15             return string.Format("You entered: {0}", value);
    16         }
    17 
    18         public CompositeType GetDataUsingDataContract(CompositeType composite)
    19         {
    20             if (composite == null)
    21             {
    22                 throw new ArgumentNullException("composite");
    23             }
    24             if (composite.BoolValue)
    25             {
    26                 composite.StringValue += "Suffix";
    27             }
    28             return composite;
    29         }
    30     }
    31 }

    App.config

    注:http://localhost:8733/Design_Time_Addresses/WCFDemo/Service1/这个地址也就是我们发布到IIS上的服务地址,可修改,视情况而定

     1 <?xml version="1.0" encoding="utf-8" ?>
     2 <configuration>
     3 
     4   <appSettings>
     5     <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
     6   </appSettings>
     7   <system.web>
     8     <compilation debug="true" />
     9   </system.web>
    10   <!-- 部署服务库项目时,必须将配置文件的内容添加到 
    11   主机的 app.config 文件中。System.Configuration 不支持库的配置文件。-->
    12   <system.serviceModel>
    13     <services>
    14       <service name="WCFDemo.Service1">
    15         <endpoint address="" binding="basicHttpBinding" contract="WCFDemo.IService1">
    16           <identity>
    17             <dns value="localhost" />
    18           </identity>
    19         </endpoint>
    20         <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    21         <host>
    22           <baseAddresses>
    23             <add baseAddress="http://localhost:8733/Design_Time_Addresses/WCFDemo/Service1/" />
    24           </baseAddresses>
    25         </host>
    26       </service>
    27     </services>
    28     <behaviors>
    29       <serviceBehaviors>
    30         <behavior>
    31           <!-- 为避免泄漏元数据信息,
    32           请在部署前将以下值设置为 false -->
    33           <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
    34           <!-- 要接收故障异常详细信息以进行调试,
    35           请将以下值设置为 true。在部署前设置为 false 
    36             以避免泄漏异常信息-->
    37           <serviceDebug includeExceptionDetailInFaults="False" />
    38         </behavior>
    39       </serviceBehaviors>
    40     </behaviors>
    41   </system.serviceModel>
    42 
    43 </configuration>

    如果我们想在创建一个WCF服务怎么办呢?

    只需,在项目上,右键->添加->新建项->WCF服务即可,自动会帮我们生成一个接口、一个实现接口类、App.config会多加一些配置信息

     第二步:调试,用vs自带的测试工具测试服务是否可行

    项目上:右键->调试->启动新实例

     之后会出现如下界面

     开始测试

     到目前为止,WCF服务已经配置好了,下面我们将WCF服务发布到IIS上

    二、WCF的发布

    第一步:发布WCF服务

    项目上:右键->发布

     第二步:指定位置

     发布后的文件

     

     三、安装IIS(已安装,请忽略安装步骤)

    Win10下安装

    控制面板->程序->启用或关闭Windows功能

     重点:

    HTTP错误一定要勾选,否则出现错误时不能够提示错误,这个是非常严重的”

     四、WCF服务部署IIS上

    第一步:注册WCF组件

    如何看是否已经注册了WCF组件,选择:Default Web Site==》功能视图==》处理程序映射,然后再查看*.svc 后缀的文件是否被svc-Integrated 或 svc-ISAPI-4.0_64/32bit 程序处理:

     

    因为我已经将WCF组件注册到IIS上了,没有的请注册

    cmd(管理员运行):ServiceModelReg.exe  –i

     第二步:aspnet_regiis.exe注册IIS

      由于我们使用的.net framework4.0以上的框架开发的应用程序,但是系统只默认注册了.NET Framework v2.0.50727,如果不注册相应的IIS那么我们访问界面时会弹出以下的错误。

     

     cmd(管理员运行):aspnet_regiis.exe  –i

     第三步:为应用程序添加应用程序池

    右键->添加应用程序池

     第四步:添加网站

     选择应用池

    为了保证当前网站的安全,需要进行权限验证,点击“连接为”,并按照下面的步骤一次输入用户名、密码,然后选择确定。(这一步可忽略)

    确定完成后点击“测试设置”出现下图所示的界面时表示当前身份验证成功。

     

     第五步:浏览当前网站

     可能会出这个错误

    查阅资料,发生这个错误的原因在于安装了高版本的.net framework 导致这种错误,可以尝试通过下面的方法解决: 

    解决方案

    1 路径:C:WindowsSystem32inetsrvconfig
    2 文件:applicationHost.config

     找到最后一行代码,在managedHandler 加上“,runtimeVersionv2.0" 即可

    1 <add name="ServiceModel" type="System.ServiceModel.Activation.HttpModule, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler,runtimeVersionv2.0" />

    然后在cmd(管理员):

    1 第一步:cd C:WindowsMicrosoft.NETFrameworkv4.0.30319
    2 第二步:aspnet_regiis.exe -iru
    3 
    4 到第二步为止,基本上都可以解决,重启.svc即可

     哎。。。。Win10系统事情在多,下面开始演示如何解决这个问题

    百度解决方案如下,利用dism工具依次执行下面命令即可

    1 cmd(管理员):
    2 
    3 dism /online /enable-feature /featurename:IIS-ISAPIFilter
    4 
    5 dism /online /enable-feature /featurename:IIS-ISAPIExtensions
    6 
    7 dism /online /enable-feature /featurename:IIS-NetFxExtensibility45
    8 
    9 dism /online /enable-feature /featurename:IIS-ASPNET45

  • 相关阅读:
    ctfhub技能树—文件上传—双写后缀
    ctfhub技能树—文件上传—00截断
    ctfhub技能树—文件上传—文件头检查
    ctfhub技能树—文件上传—MIME绕过
    ctfhub技能树—文件上传—.htaccess
    ctfhub技能树—文件上传—前端验证
    ctfhub技能树—文件上传—无验证
    ctfhub技能树—sql注入—Refer注入
    ctfhub技能树—sql注入—UA注入
    面试中被问到的知识点
  • 原文地址:https://www.cnblogs.com/chenyanbin/p/11583272.html
Copyright © 2020-2023  润新知