zoukankan      html  css  js  c++  java
  • 手动配置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。 为此,请单击“开始”,右击 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

  • 相关阅读:
    03_ if 练习 _ little2big
    uva 11275 3D Triangles
    uva 12296 Pieces and Discs
    uvalive 3218 Find the Border
    uvalive 2797 Monster Trap
    uvalive 4992 Jungle Outpost
    uva 2218 Triathlon
    uvalive 3890 Most Distant Point from the Sea
    uvalive 4728 Squares
    uva 10256 The Great Divide
  • 原文地址:https://www.cnblogs.com/dachuang/p/3732243.html
Copyright © 2011-2022 走看看