设为首页 收藏本站
查看: 1012|回复: 0

[经验分享] WCF宿主-IIS

[复制链接]

尚未签到

发表于 2015-8-12 10:59:06 | 显示全部楼层 |阅读模式
  导语:
  前一段时间开始学习WCF,尽管MSDN和网上的资料很多,但是由于刚开始接触WCF且学习资料不够详尽,所以弄的一头雾水,不知其中所表达的思想,经过这段时间的学习,终于搞明白了WCF常用的宿主。现在把学习到的知识记录下来,供以后参考,也希望能为WCF初学者带来一些帮助。
  步骤:
  一、定义消息
  消息的语义是指:服务中使用的数据对象。
  创建类库项目WCFMessage:开始-程序-Microsoft Visual Studio 2010-Microsoft Visual Studio 2010-文件-新建-项目-VisualC#-Windows-类库,解决方案名称:WCFHost,名称:WCFMessage。
  引入新的类库:System.Runtime.Serialization.dll
  创建类Person:删除项目自动生成的Class1.cs,新建一个Person类,代码如下:
  using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
  namespace WCFMessage
{
    [DataContract]
    public class Person
    {
        [DataMember]
        public string Id;
        [DataMember]
        public string Name;
        [DataMember]
        public int Age;
    }
}
二、定义服务协定
  服务协定的语义是指:定义服务的接口。
  创建类库项目WCFContract:右键解决方案'WCFHost'-添加-新建项目-VisualC#-Windows-类库,解决方案名称:WCFHost,名称:WCFContract。
  引入新的类库:System.ServiceModel.dll
  引入项目:WCFMessage
  创建类Person:删除项目自动生成的Class1.cs,新建一个IPersonService接口,代码如下:
  using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using WCFMessage;
  namespace WCFContract
{
    [ServiceContract]
    public interface IPersonService
    {
        [OperationContract]
        void AddPerson(Person person);
        [OperationContract]
        List<Person> GetPersons();
        [OperationContract]
        void RemovePerson(Person person);
    }
}
三、实现服务协定
  创建类库项目WCFService:右键解决方案'WCFHost'-添加-新建项目-VisualC#-Windows-类库,解决方案名称:WCFHost,名称:WCFService。
  引入项目:WCFMessage和WCFContract
  创建类PersonService:删除项目自动生成的Class1.cs,新建一个继承IPersonService接口的类PersonService,代码如下:
  using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WCFMessage;
using WCFContract;
  namespace WCFService
{
    public class PersonService:IPersonService
    {
        List<Person> list = new List<Person>();
        public void AddPerson(Person person)
        {
            list.Add(person);
        }
  public List<Person> GetPersons()
        {
            return list;
        }
  public void RemovePerson(Person person)
        {
            list.Remove(list.Find(p => p.Id == person.Id));
        }
    }
}
四、使用IIS承载服务
  创建WCF服务IISHost:右键解决方案'WCFHost'-添加-新建网站-VisualC#-WCF服务,解决方案名称:WCFHost,名称:IISHost。
  引入项目:WCFMessage,WCFContract,WCFService。
  删除AppCode目录下自动生成的IService.cs接口和Service1.cs
  修改Service.svc文件,修改后的内容如下:
  <%@ ServiceHost Language="C#" Debug="true" Service="WCFService.PersonService"%>
  修改Web.config配置文件,这一步很关键,这是导致错误的主要原因所在地,修改后的内容如下:
  <?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <compilation debug="false" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点 -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息-->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <!-- This section is optional with the default configuration
        model introduced in .NET Framework 4 -->
      <service  name="WCFService.PersonService">
    <endpoint address=""
                  binding="wsHttpBinding"
                  contract="WCFContract.IPersonService" />
      </service>
    </services>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
  </configuration>  发布服务:右键IISHost-发布网站,按照向导把服务发布到你指定的目录下。
  发布目录的文件夹权限设置:一要Web共享,二要给ASP.NET用户(IUSER)足够的权限。
  在IIS上为发布的服务建立虚拟目录:开始-运行-inetmgr-Internet信息服务-XXX(本地计算机)-网站-默认网站,右键-新建-虚拟目录,按照向导完成。其中,别名:IISHost,目录:发布服务的目录,访问权限:除过写入,都勾选。
  测试:在虚拟目录下,浏览Service.svc,如果出现类似如下的页面显示,则表示成功。
  PersonService 服务
  
已创建服务。
  若要测试此服务,需要创建一个客户端,并将其用于调用该服务。可以使用下列语法,从命令行中使用 svcutil.exe 工具来进行此操作:
  
  svcutil.exe http://localhost/IISHost/Service.svc?wsdl
  这将生成一个配置文件和一个包含客户端类的代码文件。请将这两个文件添加到客户端应用程序,并使用生成的客户端类来调用服务。例如:
  
C#
  class Test
{
    static void Main()
    {
        PersonServiceClient client = new PersonServiceClient();
  // 使用 "client" 变量在服务上调用操作。
  // 始终关闭客户端。
        client.Close();
    }
}
  
  Visual Basic
  Class Test
    Shared Sub Main()
        Dim client As PersonServiceClient = New PersonServiceClient()
        ' 使用 "client" 变量在服务上调用操作。
  ' 始终关闭客户端。
        client.Close()
    End Sub
End Class
  有关安装IIS和运行WCF服务的更多信息,请参考http://msdn.microsoft.com/zh-cn/library/ms751518.aspx,http://msdn.microsoft.com/zh-cn/library/ms752252.aspx
  五、测试服务
  生成客户端代理文件:开始-程序-Microsoft Visual Studio 2010-Visual Studio Tools-Visual Studio 命令提示(2010),输入cd /d E:\outputFiles,再输入svcutil.exe http://localhost/IISHost/Service.svc?wsdl,则会生成两个文件PersonService.cs和output.config。
  建立客户端应用程序:新建一个控制台应用程序(或着Windows窗体应用程序,或者WPF应用程序),这里以控制台应用程序为例,添加刚才生成的两个客户端代理文件PersonService.cs和output.config。
  引用新的类库System.Runtime.Serialization.dll和System.ServiceModel.dll
  编辑Program.cs,如下:
  using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WCFMessage;
  namespace ConsoleApplicationClient
{
    class Program
    {
        static void Main(string[] args)
        {
            PersonServiceClient client = new PersonServiceClient();
            Person person = new Person();
            person.Id = "610623195604230123";
            person.Name = "张三";
            person.Age = 54;
            client.AddPerson(person);
            Person[] list = client.GetPersons();
            Console.WriteLine("Person information Id:{0},Name:{1},Age:{2}",list[0].Id,list[0].Name,list[0].Age);
            client.RemovePerson(person);
            client.Close();
        }
    }
}到此为止,应该OK了。如果有什么疑问或好的建议请加QQ441046957,或者给我发邮件zhangjing13041@126.com。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-97852-1-1.html 上篇帖子: 2012 ASP.NET/IIS MVP 下篇帖子: 通过一个小程序,说明IIS不神秘
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表