今天尝试用控制台应用程序作为WCF宿主,遇到几个问题,这几个问题虽然都不难,但寻找解决方案相当费时费力,做记录。

WCF标准的配置文件为:

<system.serviceModel>
        <services>
            <service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior">
                <!-- Service Endpoints -->
        <!-- This endpoint is exposed at the base address provided by the host : http://localhost:1808/Service.svc-->
                <endpoint address="" binding="wsHttpBinding" contract="Microsoft.ServiceModel.Samples.ICalculator">
                    <!-- 
              部署时,应删除或替换下列标识元素,以反映
              在其下运行部署服务的标识。删除之后,WCF 将
              自动推导相应标识。
          -->
                    <identity>
                        <dns value="localhost"/>
                    </identity>
                </endpoint>
        <!-- This mex endpoint is exposed at the base address provided by the host : http://localhost:1808/Service.svc/mex-->
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="CalculatorServiceBehavior">
                    <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点-->
                    <serviceMetadata httpGetEnabled="true"/>
                    <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息-->
                    <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>

遇到问题:

1.“服务XXXXX有零个应用程序(非基础结构)终结点”。

  这是因为<service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior">的name属性没有对应到正确的名称。

在上面的例子中使用的是Microsoft.ServiceModel.Samples命名空间下的CalculatorService类,如果命名空间命或类名写错,或者写的不完全(比如只写了命名空间名字或者类名),则会出现上述错误。

2.WCF服务发布以后,Client 端无法引用WCF服务,查看错误为“application soap+xml charset utf-8 客户端和服务绑定可能不匹配”。或者使用IE访问WCF服务地址的时候显示“当前已禁用此服务元数据的发布”。

  按着《ASP.NET 3.5高级程序设计(第4版)》中的WCF案例一步步进行,书上说为了使初学者更好的关注WCF细节,先不使用WCF模版,但是进行到最后报出上述错误。书上写的配置是不包含<behaviors>节点的,这时Client 端无法正常连接服务,于是在网上各种找解决方法,在http://www.cnblogs.com/lanpei/archive/2009/10/29/1592218.html上找到累死问题解决方法,于是加上<behaviors>节点,此时仍然会报相同错误。因为书上的例子中没有<behaviors>节点,所以<service>节点中也不包含behaviorConfiguration属性,设置好behaviorConfiguration="CalculatorServiceBehavior",彻底没问题了。

3.使用NetTcpBinding绑定WCF服务,Client端引无法引用WCF服务,查看错误为“元数据包含无法解析的引用”。

  刚开始加了各种节点都不好使,后来查MSDN,下载了一个NetTcpBinding的案例仔细对比才发现是<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>中的contract="IMetadataExchange"写错了,本以为这个属性应该与<endpoint address="" binding="wsHttpBinding" contract="Microsoft.ServiceModel.Samples.ICalculator">中的contract相同,后来发现理解错误,在使用http绑定的时候写错好像无所谓,但是使用NetTcpBinding的时候,必须是IMetadataExchange,暂时还不太理解为什么。

4.使用NetTcpBinding绑定WCF服务,本机Client 端可以正常访问,但跨机器访问时提示错误“net.tcp://XXXXXX不支持请求的升级。这可能是由于不匹配的绑定”。

  这个问题很困扰,Google上查“不支持请求的升级”居然没有任何相关线索,后来忘了怎么找到解决办法的。该问题是因为服务端和客户端的安全设置不一致,也就是<security mode=""/>节点中的mode值不一致,设置成一致的(比如None,Transport)就没问题了。

5. 在host.Open()时报错“http 无法注册 URL http://+8080......”。

  当使用VS进行WCF调试的时候,需要用管理员身份打开VS。官方解释如下:

  必须使用管理特权来运行承载 WCF 服务的进程。 如果从 Visual Studio 2012 内运行服务,则必须以管理员身份运行 Visual Studio 2012。 为此,请单击“开始”,右击 Visual Studio 2012,然后选择“以管理员身份运行”。 如果从命令行提示符运行服务,则必须按类似方式以管理员身份启动命令行提示符。 单击“开始”,右击“命令提示符”,然后选择“以管理员身份运行”。

6. 在应用程序配置文件中添加 MEX 终结点,然后尝试在代码中向服务主机添加 ServiceMetadataBehavior,则会得到以下异常:System.InvalidOperationException: 在服务 Service1 实现的协定列表中找不到协定名称“ImetadataExchange”。 将 ServiceMetadataBehavior 添加到配置文件或直接添加到 ServiceHost,以启用对该协定的支持。

  看一下是不是在service节点里没有指定属性"behaviorConfiguration",我们需要为service明确指定所需要的behavior,通过behavior的name属性进行相互绑定。在本示例中使用的是: behaviorConfiguration="CalculatorServiceBehavior"。

参见:http://msdn.microsoft.com/zh-cn/library/ms751519(v=vs.110).aspx

7. VS2012调试WcfServiceLibrary时弹出提示“远程操作花费的时间比预期长”。

  这是因为64位win7 32位应用程序访问网络可能出错造成的,因为vs2012是win32程序,所以需要重置一下网络。以管理员身份运行命令行,在弹出的窗口中运行如下命令:

  netsh winsock reset catalog

  netsh int ip reset reset.log hit

8. 在VS2012中使用异步调用WCF时,找不到BeginXXXX()方法。     

    using (BasicMathClient proxy = new BasicMathClient())
{
proxy.Open(); IAsyncResult result = proxy.BeginAdd(2, 5, ar =>
{
Console.WriteLine("2 + 5 = {0}", proxy.EndAdd(ar));
}, null);
Console.WriteLine(result);
Console.Read();
}

  找不到红色部分的方法,是由于添加引用的时候没有选择“生成异步操作”,如下图:

  

个人觉得,的确像书上说的那样,不使用模板会关注WCF的一些细节,可以更好的理解WCF,之前直接用WCF模板做成类似WebService的服务,然后部署到IIS上,觉得很简单,根本没想过改变宿主或者安全性之类的问题。最近重新学习WCF才发现,要注意的东西还挺多。

原文出处:http://www.cnblogs.com/jiajinyi/archive/2009/12/01/1614422.html

手动配置WCF宿主的.config文件遇到的几种错误的更多相关文章

  1. WinForm读取指定的config文件的内容

    config文件的使用 一.缘起 最近做项目开始使用C#,因为以前一直使用的是C++,因此面向对象思想方面的知识还是比较全面的,反而是因没有经过完整.系统的.Net方面知识的系统学习,经常被一些在C# ...

  2. Config文件的使用:通过程序修改Config文件

    对于config文件,一般情况下都是使用ConfigurationManager加载,然后通过读取相应节点的值来获取想要的数据,但是,有时候需要修改config文件的值,这时候就用到了OpenExeC ...

  3. WCF客户端C#代码 配置config文件

    不多说了,直接上代码吧.... 服务端Web.config文件中bindings配置 <bindings> <wsHttpBinding> <binding name=& ...

  4. WinForm中使用XML文件存储用户配置及操作本地Config配置文件

    大家都开发winform程序时候会大量用到配置App.config作为保持用户设置的基本信息,比如记住用户名,这样的弊端就是每个人一些个性化的设置每次更新程序的时候会被覆盖. 故将配置文件分两大类: ...

  5. Winform 数据库连接app.config文件配置 数据库连接字符串

    1.添加配置文件 新建一个winform应用程序,类似webfrom下有个web.config,winform下也有个App.config;不过 App.config不是自动生成的需要手动添加,鼠标右 ...

  6. Winform数据库连接app.config文件配置

    1.添加配置文件 新建一个winform应用程序,类似webfrom下有个web.config,winform下也有个App.config;不过 App.config不是自动生成的需要手动添加,鼠标右 ...

  7. C# 程序修改config文件后,不重启程序刷新配置ConfigurationManager

    基本共识: ConfigurationManager 自带缓存,且不支持 写入. 如果 通过 文本写入方式 修改 配置文件,程序 无法刷新加载 最新配置. PS. Web.config 除外:Web. ...

  8. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  9. 如何通过倾斜摄影数据手动配置s3c索引文件?

    如何通过倾斜摄影数据手动配置s3c索引文件? 大家知道,倾斜摄影数据最常见的是OSGB格式,并且是由一个一个的Tile分级文件夹构成的Data文件夹.结构一般如下图所示: 那么,如何才能把模型的各个瓦 ...

随机推荐

  1. Meisell-Lehmer算法(统计较大数据里的素数)

    http://acm.hdu.edu.cn/showproblem.php?pid=5901 1e11的数据量,这道题用这个算法花了202ms. #include<bits/stdc++.h&g ...

  2. 微信开放平台API开发资料

    微信大概两年前开启了微信公众平台的API供开发者使用,从账号登陆.消息发送.用户账号管理.公众号菜单.客服接口.微信商店接口.用户卡券接口 以及微信支付接口.可以说是全方面覆盖了电商所需要的要素,与阿 ...

  3. [BIM]BIM中IFC介绍

    ifc是干什么的,看下图 ifc架构图 下文转自:http://www.bimcn.org/cjwt/201506053789.html IFC目前是国际通用的BIM标准,现在很多BIM软件都采用其作 ...

  4. day3 python 函数

    常犯的错误: IndentationError:expected an indented block说明此处需要缩进,你只要在出现错误的那一行,按空格或Tab(但不能混用)键缩进就行... 函数是指一 ...

  5. c#播放器

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. A Simple Problem with Integers(树状数组HDU4267)

    A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (J ...

  7. The shortest problem

    The shortest problem Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...

  8. 山东理工大学第七届ACM校赛-飞花的鱼塘 分类: 比赛 2015-06-26 10:30 43人阅读 评论(0) 收藏

    飞花的鱼塘 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 一日,飞花壕在稷下湖游玩,忽然,飞花巨有了一个养鱼的想法,于是,他大手 ...

  9. Sqlite查询时间段内的数据问题解决!

    最近搞Sqlite本地查询,需求为查询某时间段内的数据,在SQL中我们都知道为: select * from tblName where rDate Between '2008-6-10' and   ...

  10. Codeforces Round #368 (Div. 2) A

    Description Small, but very brave, mouse Brain was not accepted to summer school of young villains. ...