手动配置WCF宿主的.config文件遇到的几种错误

今天尝试用控制台应用程序作为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。 Start, right-click Visual Studio 2012 and select Run As Administrator.‘
data-guid="e0e60e8485186558339e5b617117b907">为此,请单击“开始”,右击 Visual Studio 2012,然后选择“以管理员身份运行”。 如果从命令行提示符运行服务,则必须按类似方式以管理员身份启动命令行提示符。 Start, right-click Command Prompt and select Run As Administrator.‘
data-guid="45717ccdcc082d554d49bfd2f7215c98">单击“开始”,右击“命令提示符”,然后选择“以管理员身份运行”。

6. ServiceMetadataBehavior to your service host in code you get the following exception: ‘
data-guid="2c8f22465dff8e1668d8989117c4725b">在应用程序配置文件中添加 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

时间: 2024-08-25 07:50:53

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

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

不多说了,直接上代码吧.... 服务端Web.config文件中bindings配置 <bindings> <wsHttpBinding> <binding name="httpconf" closeTimeout="10:10:10" openTimeout="10:10:10" receiveTimeout="10:10:10" sendTimeout="10:10:10"

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

1.添加配置文件 新建一个winform应用程序,类似webfrom下有个web.config,winform下也有个App.config;不过 App.config不是自动生成的需要手动添加,鼠标右健项目—〉添加—〉添加新项—〉添加  应用程序配置文件文件[App.Config]. 2.配置文件如下 <?xml version="1.0" encoding="utf-8" ?><configuration>  <appSettings

atitit.手动配置列表文件的选择and 数据的层次结构 attilax总结最佳实践--yaml

atitit.手动配置列表文件的选择and 数据的层次结构 attilax总结最佳实践--yaml 1. yaml是个好的选择.. 1 2. 数据的层次结构--结构:hash,list,和block literal. 1 3. yaml跟json的实现区别 1 4. xml的优点及json的问题 2 4.1. ide友好 2 4.2. JSON也适合与任何数据,复杂struts难以阅读 2 4.3. json难以手工维护 3 5. 基于YAML的开源项目解析YAML文件最常用的Java库是JvY

Web.Config文件配置小记

<system.web>  <!--             设置 compilation debug="true" 将调试符号插入            已编译的页面中.但由于这会             影响性能,因此只在开发过程中将此值             设置为 true.        -->  <compilation debug="true"/>  <!-- 配置验证级别            通过 <

修改和获取web.config或app.config文件appSettings配置节中的Add里的value属性 函数

1: /// <summary> 2: /// 修改web.config或app.config文件appSettings配置节中的Add里的value属性 3: /// </summary> 4: /// <remarks> 5: /// 注意,调用该函数后,会使整个Web Application重启,导致当前所有的会话丢失 6: /// </remarks> 7: /// <param name="key">要修改的键key

Unity中Web.Config文件的配置与调用

在上一篇文章“Unit简单依赖注入”我们可以实现构造对象和被依赖对象之间的 松耦合,使我们的抽象层(Player)能够保持稳定,但是在并没有把客户类和Player类之间彻底解耦,即当我们不想使用MP3Player注入,而 想使用CDPlayer注入时,我们需要修改客户类的容器注册.下面我们使用web.config配置文件来解决这个问题.Unity 应用程序块可以从 XML 配置文件中读取配置信息.配置文件可以是 Windows Forms 应用程序的 App.config 或者 ASP.NET

config文件中可以配置查询超时时间

web.config配置数据库连接 第一种:获取连接字符串 首先要定义命名空间 system.configuration 1.  string connstr= string constr = ConfigurationManager.AppSettings["connstring"]; web.config文件:加在<appsettings>和</appsettings> 之间 <appsettings> <add key="con

Web.Config文件配置之限制上传文件大小和时间

在邮件发送系统或者其他一些传送文件的网站中,用户传送文件的大小是有限制的,因为这样不但可以节省服务器的空间,还可以提高传送文件的速度.下面介绍如何在Web.Config文件中配置限制上传文件大小与时间. 在Web.Config文件中配置限制上传文件大小与时间字符串时,是在<httpRuntime><httpRuntime/>节中完成的,需要设置以下2个属性: maxRequestLength属性:用于防止服务器攻击,例如因用户向服务器发送大型文件而导致的拒绝访问.默认值为4096(

C# WinForm中 App.config 文件配置

应用程序配置文件,对于asp.net是 web.config对于WINFORM程序是 App.Config(ExeName.exe.config). 配置文件,对于程序本身来说,就是基础和依据,其本质是一个xml文件,对于配置文件的操作,从.NET 2.0 开始,就非常方便了,提供了 System [.Web] .Configuration 这个管理功能的NameSpace,要使用它,需要添加对 System.configuration.dll的引用. 对于WINFORM程序,使用 System