一,新建WCF服务引用程序

  1,删除.svc文件,全部删除。

  2,新建 IService 类

namespace TestWcf
{
[ServiceContract]
public interface IService
{
[OperationContract]
string DoWork();
} }

  3,实现接口类 Service类

namespace TestWcf
{
public class Service : IService
{
public string DoWork()
{
return "你妹!";
}
}
}

  4,编写配置文件

  <system.serviceModel>
<!--添加此节点,否则出现405错误-->
<bindings>
<wsHttpBinding>
<binding name="NoneSecurity"
maxBufferPoolSize="" maxReceivedMessageSize="" useDefaultWebProxy="false">
<readerQuotas maxStringContentLength="" maxArrayLength=""/>
<security mode="None"/>
</binding>
</wsHttpBinding>
</bindings> <behaviors>
<serviceBehaviors>
<behavior name="metadataBehavior">
<!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors> <protocolMapping>
<add binding="wsHttpBinding" scheme="http" />
</protocolMapping> <services>
<service name="TestWcf.Service" behaviorConfiguration="metadataBehavior">
<endpoint address="" binding="wsHttpBinding" contract="TestWcf.IService" bindingConfiguration="NoneSecurity">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services> <!--无svc文件wcf服务激活-->
<serviceHostingEnvironment>
<serviceActivations>
<add relativeAddress="Service.svc" service="TestWcf.Service"/>
</serviceActivations>
</serviceHostingEnvironment> </system.serviceModel>

  5,注意事项

  以下代码是无.svc,激活WCF服务的关键,WCF4.0的新特性

从消息交换的角度来说,客户端对IIS/WAS寄宿下服务的调用本质上体现在对.svc这个真实存在的物理文件的访问。如果服务尚未激活,WCF最终根据读取请求的物理文件来激活相应的服务。具体来说,就是获 取用于创建ServiceHost的ServiceHostFactory的类型(如果没有通过<%@ServiceHost%>指令的 Factory进行显式设置,默认使用的ServiceHostFactory的类型为 System.ServiceModel.Activation.ServiceHostFactory)。在正确解析出 ServiceHostFactory类型之后,通过反射创建用于寄宿服务的ServiceHost对象。

如果WCF的服务端能够根据请求正确地创建出基于目标服务的ServiceHost,就能解决服务的激活问题。进一步来说,如果服务端能够维护一个 Service/ServiceHostFactory与请求地址之间的映射关系,我们就可以不再需要.svc文件,因为.svc对于服务激活来说就是起 到了这么一个映射的作用。在最新的WCF中,这么一个映射关系可以在配置文件中进行设置。换言之,如果在配置对这个映射关系进行了相应设置之后,我们将不 再需要为服务定义了.svc文件了。

在<system.serviceModel>/<serviceHostingEnvironment>配置节下,具有 一个<serviceActivations>子节点。上述的关于Service/ServiceHostFactory与请求地址之间的映 射关系就定义在这个配置节点下。具体来说,<serviceActivations>配置节下的配置元素具有三个基本的属性,其中 service和factory对用着原来定义在.svc文件中<%@ServiceHost>指令的Service和Factory属性, 而relativeAddress则表示服务相对服务寄宿的IIS站点的地址,该地址必须以.svc为后缀。下面一段配置与上面给出的.svc文件具有相 同的作用,有了这段配置,.svc就不再需要了。

   <!--无svc文件wcf服务激活-->
<serviceHostingEnvironment>
<serviceActivations>
<add relativeAddress="Service.svc" service="TestWcf.Service"/>
</serviceActivations>
</serviceHostingEnvironment>

二,不直接引用WCF服务,使用代理类实现对WCF的调用

  1,新建控制台程序,新建客户端代理类,MyClient

namespace WCFClient
{
/// <summary>
/// 用于调用服务的类
/// </summary>
public class MyClient : ClientBase<IService>, IService
{
public MyClient(Binding binding, EndpointAddress edpAddress)
: base(binding, edpAddress)
{ } /// <summary>
/// 调用服务端函数
/// </summary>
/// <returns></returns>
public string DoWork()
{
return base.Channel.DoWork();
} }
}

  2,调用测试

namespace WCFClient
{
class Program
{
static EndpointAddress edpHttp = new EndpointAddress("http://10.11.109.7:8001/Service.svc");
static void Main(string[] args)
{
MyClient client = new MyClient(new WSHttpBinding(SecurityMode.None), edpHttp); Console.WriteLine(client.DoWork()); Console.ReadKey();
}
}
}

  3,运行结果

这样就可以不需要添加服务引用,而直接纯代码手工实现对WCF的调用。

  

WCF无.SVC文件服务激活,及不添加服务引用调用WCF的更多相关文章

  1. WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]

    WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...

  2. VS2010中使用Jquery调用Wcf服务读取数据库记录

    VS2010中使用Jquery调用Wcf服务读取数据库记录 开发环境:Window Servere 2008 +SQL SERVE 2008 R2+ IIS7 +VS2010+Jquery1.3.2 ...

  3. [转]学习 WCF (6)--学习调用WCF服务的各种方法

    转自:http://www.cnblogs.com/gaoweipeng/archive/2009/07/26/1528263.html 作者这篇博文写得很全面. 根据不同的情况,我们可以用不同的方法 ...

  4. WCF服务寄宿IIS与Windows服务 - C#/.NET

    WCF是Windows平台下程序间通讯的应用程序框架.整合和 .net Remoting,WebService,Socket的机制,是用来开发windows平台上分布式开发的最佳选择.wcf程序的运行 ...

  5. WCF服务寄宿IIS与Windows服务

      WCF是Windows平台下程序间通讯的应用程序框架.整合和 .net Remoting,WebService,Socket的机制,是用来开发windows平台上分布式开发的最佳选择.wcf程序的 ...

  6. 调用WCF服务的几种方式

    首先发布了一个名为PersonService的WCF服务.服务契约如下: [ServiceContract]     public interface IPersonService     {     ...

  7. 在 Node.js 上调用 WCF Web 服务

    摘要:有时我们需要在WCF中做一些复杂数据处理和逻辑判断等,这时候就需要在NodeJS中调用WCF服务获取数据,这篇文件介绍如何在Node中调用WCF服务获取数据. Node项目中调用WCF服务获取数 ...

  8. (转)2.4.1 基础知识--添加服务引用与Web引用的区别

    <Web服务开发学习实录>第2章构建ASP.NET Web服务,本章我们将学习创建Web服务的各种方法,并重点对使用Visual Studio创建ASP.NET Web服务和修改Web服务 ...

  9. WCF基础教程之开篇:创建、测试和调用WCF

    一转眼,又半个月没有更新博客了.说实话,最近确实是有点忙.不过即使再忙忙,也要抽空来学习一些东西.最近用WCF比较多,就来跟大家分享一下关于WCF的知识吧!为了让大家都能看懂,照顾一些没有学过WCF的 ...

随机推荐

  1. springboot 常见请求方式

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/80404645 本文出自[赵彦军的博客] 用户模型类 package com.yib ...

  2. (网页)css和js的版本号问题

    HTML页面自动清理js.css文件的缓存,之前用的是?v=11每次都要找寻到网页进行更改,非常的麻烦. <script type="text/javascript"> ...

  3. php 接口与前端数据交互实现

    最近在做前后端数据交互的尝试,也跳了很多坑,使用的是php+bootstrap-table+js,把一些收获记录在这里,方便查询. 这个小项目,仅有3个文件,分别为: crud.html data.p ...

  4. 将 varchar 值 'ACCE5057EC423F7C' 转换成数据类型 int 时失败

    调试别人的存储过程,然后报错了 将 varchar 值 'ACCE5057EC423F7C' 转换成数据类型 int 时失败 这让我一通找.找了一个多小时. 通过这个错可以知道,错误肯定是在联表 字段 ...

  5. ajax参数

    $.ajax({ type: "GET", url: "Login.ashx", dataType: "text", cache: fals ...

  6. PostgreSQL分页

    转自 https://blog.csdn.net/tomcat_2014/article/details/49947711 如果用过mysql,那么对 select * from xxx limit ...

  7. Windows Server 2016-管理站点复制(二)

    为了保持所有域控制器上的目录数据一致和最新,Active Directory 会定期复制目录更改.复制根据标准网络协议进行,并使用更改跟踪信息防止发生不必要的复制,以及使用链接值复制以提高效率. 本章 ...

  8. mysql 数据库 命令行的操作——对库的操作

    1.查看所有数据库 show databaese; 2.查看当前所用的数据库 show databases(): 3.切换数据库 use(数据库名): 4.创建数据库 create database ...

  9. Spring的通知类型,切入表达式写法

    转载自  https://www.cnblogs.com/ltfxy/p/9882697.html Spring中通知类型: 前置通知:目标方法执行之前进行操作,可以获得切入点信息 后置通知: 目标方 ...

  10. Python 简易版选课系统

    一.创建学生类 # # 创建学生类 import random class Student: def __init__(self,num,name,address,course_lst=None): ...