[转载]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上查“不支持请求的升级”居然没有任何相关线索,后来忘了怎么找到解决办法的。该问题是因为服务端和客户端的安全设置不一致,也就是<securitymode=""/>节点中的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 几种常见错误的更多相关文章
- WCF分布式开发常见错误解决(1):An error occurred while attempting to find services at...添加服务引用出错
WCF分布式开发常见错误解决(1):An error occurred while attempting to find services at...添加服务引用出错 当我们在客户端添 ...
- (转载)四种常见的 POST 提交数据方式
(转载)http://www.imququ.com/post/four-ways-to-post-data-in-http.html HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS ...
- ACME[free https] Linux中使用curl命令访问https站点4种常见错误和解决方法
free https certification generator https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E 每一种客户 ...
- insmod模块的几种常见错误
1. 与内核版本不一致 嵌入式开发时,模块编译时需要制定内核的路径,内核的版本信息会加入到模块文件中,如果目标板上运行的内核与模块中包含的内核版本对不上,加载就会出错,报如下错误: insmod i ...
- 关于java中static的应用及一种常见错误
JAVA中的static的应用 在web项目的开发中,遇到了类中的static方法不奏效. 在开发过程中,我定义了一个静态方法初始化数组,但是在创建类的对象后,访问该数组是全为null.我一直以为st ...
- 实用:Git 中的一些常见错误
无论是数据科学家.算法工程师还是普通开发人员,在每个团队协作开发任务中,Git 都是必不可少的版本控制工具,因此掌握它的基本操作十分有必要.但即便是教程满天飞的今天,开发人员在使用 Git 时也还是会 ...
- WCF项目中出现常见错误的解决方法:基础连接已经关闭: 连接被意外关闭
在我们开发WCF项目的时候,常常会碰到一些莫名其妙的错误,有时候如果根据它的错误提示信息,一般很难定位到具体的问题所在,而由于WCF服务的特殊性,调试起来也不是那么方便,因此往往会花费不少时间来进行跟 ...
- (转载)MySQL数据库的几种常见高可用方案
转自: https://yq.aliyun.com/articles/74454 随着人们对数据一致性的要求不断的提高,越来越多的方法被尝试用来解决分布式数据一致性的问题,如MySQL自身的优化. ...
- 避免常见的6种HTML5错误用法
一.不要使用section作为div的替代品 人们在标签使用中最常见到的错误之一就是随意将HTML5的<section>等价于<div>——具体地说,就是直接用作替代品(用于样 ...
随机推荐
- B/S一些小知识及常用控件
一: B/S网页的运行 页面在设计的时候,本身就是一个类.在运行的时间,是一个对象. 其中aspx和aspx.cs是在同一个类下. aspx是主要是负责界面,而aspx.cs主要是负责数据逻辑. 呈现 ...
- JavaScript 数组方法总结
最近公司没项目.所以所幸学学JS.毕竟很多人和我一样.属于培训机构出来的.JS基础也很差. 面试的时候面试官问你 .你会JS不.你会毫不犹豫的回答会.因为你确实用过.但是真正会的或许只是以前项目中需要 ...
- 自己动手写一个简单的(IIS)小型服务器
因为第一次在博客园发表随笔,不太会用,这个笔记是我之前在印象笔记中写好的,然后直接copy过来,有兴趣自己做一个IIS服务器的小伙伴们可以参照下面的流程做一次,也可以叫我要源代码,不过要做完,我觉得花 ...
- linux process 相关命令
1.显示指定用户信息:ps -u root 2.显示所有进程信息,连同命令行:ps -ef 3. ps 与grep 常用组合用法,查找特定进程:ps -ef|grep ssh 4. 把所有进程显示出来 ...
- 12_ServletConfig对象
[ServletConfig对象简述] 在Servlet的配置文件中,可以使用一个或多个<init-param>标签为Servlet配置一些初始化参数. 当Servlet配置了初始化参数后 ...
- bash 脚本
一.英文版 1.Advanced Bash-Scripting Guide 二.中文 1.BashGuide for Beginners 中文版
- 暑假集训(2)第五弹 ----- Who's in the Middle(poj2388)
G - Who's in the Middle Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:32 ...
- C++ DLL 获取 MSI Property
VS2010 创建 C++, Win32 DLL工程C-TEST. Stdafx.h中,在<windows.h>之后 添加引用. #include <msi.h> #incl ...
- 创建线程的两种方式比较Thread VS Runnable
1.首先来说说创建线程的两种方式 一种方式是继承Thread类,并重写run()方法 public class MyThread extends Thread{ @Override public vo ...
- JS的词法作用域
词法作用域定义实现的规则: 1 函数作用域实在定义的时候决定的,而不是在执行时候决定 2 为了实现这种词法作用域,函数内部不仅包含函数代码逻辑,还必须引用当前的作用域链. 3 函数对象可以通过作用域链 ...