wcf 托管方式有很多种,常见的托管方式,iis,was,控制台,winfrom等。

先创建一个wcf服务

IService1.cs

using System.ServiceModel;
namespace WcfServiceLibrary6
{
[ServiceContract]
public interface IService1
{
[OperationContract]
string GetData(int value);
}
}

Service1.cs

namespace WcfServiceLibrary6
{
public class Service1 : IService1
{
public string GetData(int value)
{
return string.Format("传入了数字: {0}", value);
}
}
}

下面的的宿主都调用这个例子,如果用iis和was做宿主。app.config的配置在wcf下进行。如果

 一、单纯只用IIS做宿主

配置wcf的 App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<!--指定 ASP.NET 4.5 中的异步代码路径的行为方式-->
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" />
</system.web>
<system.serviceModel>
<services>
<service name="WcfServiceLibrary6.Service1">
<!--host这段可以测试时启动wcf测试客户端,运行后除了弹出测试客户端,也可以在浏览器中用此address访问-->
<host>
<baseAddresses>
<add baseAddress = "http://localhost:8733/Service1/" />
</baseAddresses>
</host>
<endpoint binding="basicHttpBinding" contract="WcfServiceLibrary6.IService1" />
</service>
</services>
<!--元数据-->
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

注意

如果像IIS这种自带地址的容器,可以既不需要基地址同时也不需要终结点地址。

  <system.serviceModel>
<services>
<service name="WcfServiceLibrary6.Service1">
<endpoint binding="basicHttpBinding" contract="WcfServiceLibrary6.IService1" />
</service>
</services>
<!--元数据-->
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>

如果不带基地址,在visual studio中 F5运行调试的时候就会报错无法进行调试了,但部署的iis还是可以正常使用的。

2.创建IIS

3.发布

右键vs工程项目,发布后

IIS根目录下

bin里

可能遇到的错误1

错误原因可能是应用程序池版本太低,

改成 framework4.0

可能遇到的错误2

添加MIME

.svc

application/octet-stream

可能遇到的错误3

用aspnet_regiis注册4.0框架

cd C:\Windows\Microsoft.NET\Framework\v4.0.30319

aspnet_regiis.exe -i

4.一个简单的客户端调用,之后开一篇专门介绍

创建一个客户端控制台后,添加服务引用

自动添加xml

    <system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService1" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://xtz-01805141702:8001/WcfServiceLibrary4.Service1.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService1"
contract="ServiceReference1.IService1" name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>

并自动导入 System.ServiceModel

编写客户端程序

using System;
namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
var client = new ServiceReference1.Service1Client();
var str=client.GetData();
Console.WriteLine(str);
Console.ReadLine();
}
}
}

运行

 

二、使用Windows Process Activation Service (WAS)-Windows进程激活服务托管

1.用IIS托管的应用程序

2.添加wcf功能

控制面板-windows功能

之后会自动勾选,was

3.在IIS创建一个网站

红框是安装wcf功能后多出来的选项。

再添加一个net.tcp协议。

4.开启net.tcp协议

5.wcf配置

  <system.serviceModel>
<services>
<service name="WcfServiceLibrary6.Service1">
<endpoint binding="netTcpBinding" contract="WcfServiceLibrary6.IService1" />
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior >
<serviceMetadata httpGetEnabled="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>

6.访问

如果同时开启 mex和 http-get

可以同时引用

http://localhost:8002/WcfServiceLibrary6.Service1.svc  和

net.tcp://localhost/WcfServiceLibrary6.Service1.svc/mex     808端口是net.tcp的默认端口所以没有显示出来

如果只开启mex ,虽然可以用http方式查看到,但只能用tcp的方式引用

错误1 

(1)cmd

(2)cd  C:/Windows/Microsoft.NET/Framework/v4.0.30319

(3)aspnet_regiis.exe -i

三、控制台托管

wcf程序目录

创建一个控制台,引用上面的wcf工程和System.ServiceModel。

XML方式配置终结点

Program.cs

using System;
using System.ServiceModel;
using WcfServiceLibrary6; namespace ConsoleApp6
{
class Program
{
static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(Service1));
host.Open();
Console.WriteLine("Service已经启动,按任意键终止服务!");
Console.Read();
host.Close();
}
}
}

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
</startup>
<system.serviceModel>
<services>
<service name="WcfServiceLibrary6.Service1">
<host>
<baseAddresses>
<add baseAddress = "http://localhost:8733/" />
</baseAddresses>
</host>
<endpoint address="" binding="basicHttpBinding" contract="WcfServiceLibrary6.IService1">
</endpoint>
<!--此方式叫做元数据交换终结点MEX的标准方式,如果开启了基于http-get的元数据serviceMetadata的httpGetEnabled="True",
两种方式必须至少使用一种-->
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!--如果开启了MEX, 就可以只写 serviceMetadata 标签-->
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

 服务端编程方式配置终结点

删除 App.config<system.serviceModel></system.serviceModel> 利用服务端编程的方式托管wcf

同样引入引用上面的wcf工程dll和System.ServiceMode0.dlll。

Program.cs

    class Program
{
static void Main(string[] args)
{
//增加两个基地址
Uri baseAddressTcp = new Uri("net.tcp://localhost:9876/");
Uri baseAddressHttp = new Uri("http://localhost:9879/");
//第二个参数可以接受url类型的数组,这就有了两个基地址
ServiceHost host = new ServiceHost(typeof(Service1),baseAddressTcp); //设置http-get元数据交换为
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.HttpGetUrl = baseAddressHttp;
host.Description.Behaviors.Add(smb); //设置终结点相当于xml的abc,第一个参数contract契约,第二个参数binding绑定,第三个参数address地址
host.AddServiceEndpoint(typeof(IService1), new NetTcpBinding(), "");
host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex"); host.Open();
Console.WriteLine("Service已经启动,按任意键终止服务!");
Console.Read();
host.Close();
}
}

正式运行时设置取消暴露的http服务接口

smb.HttpGetEnabled = false;

访问http

添加服务引用

四 windows服务做宿主

1.创建windows服务

对应红箭头,右键安装服务

引用

wcfseviceLibrary6.dll是wcf服务。

2.设置属性

3

Service1.cs.

    public partial class Service1 : ServiceBase
{
public ServiceHost serviceHost;
public Service1()
{
InitializeComponent();
} protected override void OnStart(string[] args)
{
serviceHost=new ServiceHost(typeof(WcfServiceLibrary6.Service1));
serviceHost.Open();
} protected override void OnStop()
{
if (serviceHost != null)
{
serviceHost.Close();
}
}
}

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
</startup>
<system.serviceModel>
<services>
<service name="WcfServiceLibrary6.Service1">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8001/"/>
</baseAddresses>
</host>
<endpoint address="" binding="netTcpBinding" contract="WcfServiceLibrary6.IService1"></endpoint>
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior >
<serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8002"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

4.部署

参照 https://www.cnblogs.com/buchizaodian/p/6160816.html

注意 InstallUtil.exe工具要v4.0里的   在 C:\Windows\Microsoft.NET\Framework\v4.0.30319

InstallService-WcfService.cmd  安装win服务代码,

InstallUtil.exe WindowsService1.exe
pause

UninstallService-WcfService.cmd 卸载服务代码

InstallUtil.exe /u WindowsService1.exe
pause

注意 这三个.exe工具属性设置成,始终复制。编译时就可以自动拷贝到bin文件夹下

5.

四、winform

比如在右下角做一个图标程序,开关控制wcf运行关闭等功能。略

五、元数据交换

想要于客户端通讯必须开启元数据交换,开启方式有两种,基于HTTP-GET的元数据交换和元数据交换终结点。

(1)基于HTTP-GET的元数据交换

HTTP-GET的元数据交换属于一种服务行为,开启以后是这种画面。(即使非IIS容器也ok)

在xml中开启行为

    <behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>

serviceMetadata 标签有一个 httpGetUrl属性。可以是相对地址,也可以是绝对地址。

相对地址

    <behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True" httpGetUrl="GetUrlService"/>
</behavior>
</serviceBehaviors>
</behaviors>

绝对地址

报错???

用代码开启行为

????

(2)元数据交换终结点

http-get的方式不是行业标准的方式。标准方式是使用元数据交换终结点,他可以支持其他的平台

  <system.serviceModel>
<services>
<service name="WcfServiceLibrary6.Service1">
<endpoint binding="basicHttpBinding" contract="WcfServiceLibrary6.IService1" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>

五、基础

1.基地址

2.同一个host可以没有基地址,也可以有多个基地址。但多个基地址有要求,多个基地址不能采用相同的协议。

可以让同一个服务的多个终结点使用相同的基地址,但URL不能相同

2.绑定配置

3.默认绑定

4.协议映射

5.Configure()方法编程终结点配置

6.默认行为

7.默认终结点

如果服务只有基地址,没有终结点,则wcf会为服务默认添加终结点。

终结点的binding类型会根据基地址自动推断。

默认添加的终结点数=基地址数*契约数。

如果契约如下

IService1

    [ServiceContract]
public interface IService1
{
[OperationContract]
string GetData(int value);
} [ServiceContract]
public interface IService2
{
[OperationContract]
string GetData2(int value);
}

Service1.cs

    public class Service1 : IService1,IService2
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
} public string GetData2(int value)
{
return string.Format("请输入: {0}", value);
}
}

当服务端宿主设置了两个基地址但没有终结点

        static void Main(string[] args)
{
Uri httpBaseAddress = new Uri("http://localhost:9001/");
Uri tcpBaseAddress = new Uri("net.tcp://localhost:9002/"); ServiceHost host = new ServiceHost(typeof(Service1), httpBaseAddress, tcpBaseAddress); ////启动行为
ServiceMetadataBehavior smb = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (smb == null)
{
smb = new ServiceMetadataBehavior();
}
smb.HttpGetEnabled = true;
host.Description.Behaviors.Add(smb);
host.Open();
Console.WriteLine("Service已经启动,按任意键终止服务!");
Console.Read();
host.Close();
}

结果

(1)WCF托管的更多相关文章

  1. WCF 托管在IIS中遇到Http的错误

    IIS8中部署WCF服务出错:HTTP 错误 404.3 - Not Found http://www.cnblogs.com/xwgli/archive/2013/03/15/2961022.htm ...

  2. FastReport的WCF托管到Windows服务的配置文件

    官网上找到的,还没有来得及研究,有时间了再研究. <?xml version="1.0"?> <configuration> <appSettings ...

  3. 无法自动调试 未能调试远程过程。这通常说明未在服务器上启用调试 WCF 托管在IIS上

    解决方案,把新建的网站的app.config修改下配置 <system.web> <!-- 设置 compilation debug="true" 可将调试符号插 ...

  4. wcf托管在IIS上,提示未能加载

    “/”应用程序中的服务器错误. 未能加载文件或程序集“ZBMYunCoreLib.DLL”或它的某一个依赖项.找不到指定的模块. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪 ...

  5. Wcf托管在IIS中,HttpContext.Current为空

    config中需要配置 <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 另需要在服务类上加 ...

  6. WCF学习系列二---【WCF Interview Questions – Part 2 翻译系列】

    http://www.topwcftutorials.net/2012/09/wcf-faqs-part2.html WCF Interview Questions – Part 2 This WCF ...

  7. WCF 入门(29)

    前言 最近工作比较忙,加了会班就不想再写东西了,就想洗洗睡. 但是这个视频真的不能断,不能像过去一样写了几集就停了. 现在公司在做一个MVC框架的项目,话说已经一年没有写MVC了,重新上手的感觉还可以 ...

  8. WCF 入门(23,24)

    前言 重新找了工作,过去的事情就过去好了.有些不一样的经历也不是说一定就是坏事. 第24集 在控制台应用程序中自托管WCF服务 Self hosting a wcf service in consol ...

  9. WCF入门(三)---WCF与Web服务/Web Service

    下面列出了WCF和Web服务之间存在一些重大差异. 属性:WCF服务是通过定义ServiceContract和OperationContract属性,而在Web服务,WebService和WebMet ...

随机推荐

  1. mysql--timestamp加减

    利用timestamp()对timestamp类型进行秒加减操作: 1.加10秒: 2.减10秒:

  2. C 语言 习题 1-9

    练习1-9 编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替. #include <stdio.h> int main(int argc, char const *ar ...

  3. Linux之ubuntu系统操作学习笔记

    1,swp分区:当内存不够时用swp分区顶替内存 2,语言环境检查  locale –a:可以明白系统支持什么语言 3,安装软件: apt-cache search(软件):搜索软件 apt-cach ...

  4. python week09 Mysql 数据库基础知识

    第一篇:初识数据库 注:<基础概念,不再赘述,点开链接查看> 第二篇:库相关操作 一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些 ...

  5. c#之线程同步--轻量级同步 Interlocked

    轻量级同步 Interlock 为什么说它是轻量级呢?因为它仅对整形数据(即int类型,long也行)进行同步. 如果你学过操作系统里面的PV操作(即信号量),那么你对它已经了解了一般.它实现的正是如 ...

  6. CSU-2116 Polyline Simplification

    CSU-2116 Polyline Simplification Description Mapping applications often represent the boundaries of ...

  7. Leetcode 507.完美数

    完美数 对于一个 正整数,如果它和除了它自身以外的所有正因子之和相等,我们称它为"完美数". 给定一个 正整数 n, 如果他是完美数,返回 True,否则返回 False 示例: ...

  8. Linux下测试SSD固态硬盘写入速度

    最近买了一个256GB的SSD固态硬盘,想测试一下写入速度,于是如下操作. 部分代码: gettimeofday(&start, NULL); int fd = open("test ...

  9. Summary—【base】(HTML)

    Html知识点: 1. 建议开发人员计算机基本配置 a) 显示所有文件的后缀名* b) 文件的排列方式改为详细信息,并且名称一定要能够全部显示出来 c) 使用小的任务栏 d) 将常用的工具锁定到任务栏 ...

  10. 玲珑杯”ACM比赛 Round #15

    手速狗从西安回来一只浑浑噩噩,好不容易迎来一场送饭比赛体验一把河南的优势,结果被高中生狂虐,无缘奖金..我的奖品梦就这样一次次被打破.... A -- Reverse the lights 最后半小时 ...