wcf问题集锦

1.处理程序“svc-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

  1. HTTP 错误 404.3 - Not Found

    由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。

    解决办法:以管理员运行命令:C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe -i

  2.  HTTP 错误 500.21 - Internal Server Error 

    处理程序“svc-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    解决办法:

    原因:在安装Framework v4.0之后,再启用IIS,导致Framework没有完全安装

    解决:开始->所有程序->附件->鼠标右键点击“命令提示符”->以管理员身份运行->%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i

    如果还不行,可检查IIS的应用程序池,是否使用集成模式,如果不是则改成集成模式

2.WCF Add Service Reference gotcha with Windows Server

We recently switched from developing in Vista to Windows Server 2003. Someone had the bright idea that we should develop in the same environment the application is going to be hosted on. Go figure.

What that meant is that you run into wierd issues like this one. When trying to add a Service Reference to a WCF service hosted under IIS you keep getting this 'Add Service Reference Error':

Metadata contains a reference that cannot be resolved: 'http://merill/Services.Host/ClientProfile.svc?wsdl'.
The WSDL document contains links that could not be resolved.
There was an error downloading 'http://merill/Services.Host/ClientProfile.svc?xsd=xsd0'.
The underlying connection was closed: An unexpected error occurred on a receive.
Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.
An existing connection was forcibly closed by the remote host
Metadata contains a reference that cannot be resolved: 'http://localhost/Services.Host/ClientProfile.svc'.
Metadata contains a reference that cannot be resolved: 'http://localhost/Services.Host/ClientProfile.svc'.
If the service is defined in the current solution, try building the solution and adding the service reference again.

The key part of this message is the reference to the downloading of the xsd. When I tried accessing the .svc url in a browser it worked fine, but trying to access the .svc?xsd=xsd0 brings up the generic 'cannot display webpage' message.

When you unleash your weapon (Process Monitor) on the csc.exe process (this is the compiler generating the xsd) you'll realise that the IIS identity IIS_WPG does not have access to the Windows\Temp folder. Give enough rights to the folder and viola problemo solved.

Reference:http://merill.net/2008/04/wcf-add-service-reference-gotcha-with-windows-server/

3. gsoap 调用 WCF 415 错误 (soap: 非托管c++ 客户端的开发(gsoap)

问题: gsoap调用 WCF 返回错误415  unsported media type

我要wireshark抓包,发现WCF返回: Cannot process the message because the content type 'application/soap+xml; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'.

分析: WCF server端 basicHttpBinding 只支持 soap 1.1,而client端 gsoap生成的客户端代码 默认为 soap1.2

解决:gsoap 的soapcpp2的参数 -1 为soap 1.1   -2为soap1.2

 例如:D:\GSoap\gsoap-2.8\gsoap\bin\win32\soapcpp2 -i -x -d D:\GSoap\recycle -C D:\GSoap\recycle.h -I D:\GSoap\gsoap-2.8\gsoap\import -1

4.C++的gsoap客户端与基于WCF的C#服务端Web Service交互的问题

服务端使用SOAP 1.2,在Windows下用C#开发;客户端使用跨平台的gsoap开发包(版本为2.7.15),在Linux下使用C++开发。

(1)证书问题。

当Web Service使用SSL/HTTPS进行通信时,跨平台的证书问题怎么处理?如果你对证书非常了解,那么没问题,你可以在十几分钟内就搞定它。但是如果你根本就不知道”自签名的证书“是怎么一回事的话,那就有得受了。证书还牵涉到你所使用的SOAP开发包,因为不同的开发包要求使用的证书格式也不同。例如,gsoap就要用pem格式的证书文件。这个文件怎么得到?自签名的证书又是怎么一回事?它跟Web Service有什么关系?这个真不是一两句话就可以说得清楚的,恐怕要从”Web Service是什么“来说起了。但是我也不可能长篇大论地打几万字上来,所以有些基础的概念还是请您自己挪步google吧。

文章来源:http://www.codelast.com/

(2)SOAP 1.1/1.2的兼容性问题。

当服务端和客户端使用的SOAP版本不同时,能不能配合上?我没有试过,当然,我的直接想法就是:服务端用哪个版本,客户端就用哪个版本的SOAP,所以事先双方最好确定一下各自的版本。但是就算是同一版本,由于服务端和客户端不是同一平台的,也有可能出问题。例如,我的Web Service服务端使用SOAP 1.2,我使用gsoap做的client死活就是无法调用它。这个问题还没解决,但是我说一下其中的几个问题。

一是HTTP header中的SOAPAction的问题。使用gsoap开发,可以生成调试信息,把发送的HTTP头信息及XML数据保存到文件中(默认文件名为“SENT.log”,文件名可以在运行时(runtime)来修改),打开它,可以看到有用的调试信息,以帮助你确定问题所在。gsoap 2.7.15的pdf文档里写得很清楚,soapcpp2默认生成的代理类是SOAP 1.1的,如果要生成SOAP 1.2的,请使用-2参数,但是在某个国外的技术论坛中,我看到一些人说-2参数有时候是无效的(这种说法未经证实),到底是SOAP 1.1还是SOAP 1.2,其实是由.nsmap文件来控制的。.nsmap文件保存的是XML命名空间表,该文件是soapcpp2编译器生成的。

 

5.关于 WCF的 传统用法 几点忠告:

  >WCF不支持 List 等一切 集合类型 (一切集合 都会被 WCF 转换为 数组)
  >WCF不支持 Hashtable 等大部 哈希类型 (大部哈希 都会被 WCF 转换为 Dictionary<object,object>)
    ——部分特殊情况 WCF 连 Dictionary<object, object> 都不支持
  >注意在 服务端 对 需要的对象 声明特性 : [KnownType(typeof(TestVModel_User))]


  >建议: WCF穿透对象 尽量不要出现 List 和 Hash —— 可以的话 尽量用 T[] 和 Dictionary<K, V>
  >警告: 使用 Hashtable 就是一个 不折不扣 的 埋坑行为。

*******VS项目属性里好像有对这些的设置,具体没试过

关于 WCF的 另类用法 几个方案:
  PS: "穿透实体" = "视图实体"
  "数据实体" 指 保存有效数据的 实体对象


  >方案一 : WCF 传统用法 : 写服务端、生成客户端代理类
    >优势 :   代码简单;
         用 穿透实体 保护 数据实体;
    >劣势 :   数据类型 狭隘; 存在 不稳定因素;
         服务端改变, 所有 客户端代理类 需 重新生成 (最难维护 的 环节);


  >方案二 : WCF 穿透对象 只使用 byte[]
    >优势 :  通讯量小,速度快,类型广泛,数据稳定;不需要重新生成 代理类;
    >劣势 :  byte[] 反向解析 问题:
          >如果 是 反序列化 :则 要求客户端 存在 实体类程序集 —— 无法保护 数据实体;


  >方案三 : WCF 穿透对象 只使用 string
    >优势 : 通讯量小,速度快,数据稳定,跨Java等平台,不需要重新生成 代理类;
    >劣势 :  >只能兼容 XML 和 JSON 类型 —— 类型依然狭隘;
        >string 明文, 可能存在 安全问题;
        >需要客户端 反解析 JSON 或 XML 字符串 —— 代码多了一点;


  >方案四 :  >系统内网电脑 WCF 使用 byte[] —— 共享 实体类程序集
       >系统外网电脑 另外开辟 Web服务, 另外开辟 穿透实体;
    >优势 : 在 有安全机制 的 内网, 使用 稳定快速的 方式;
    >劣势 : 在 有风险   的 外网, 使用 另外的暴露 方式;

 

  最后 : 实体类程序集
    >只包含 视图实体类, 字段属性 —— 结构简单;
    >并不包含 逻辑代码, 被外部引用 —— 真的会有 安全风险 么?

 

  当然, 任何一种方案, 难度都差不多 —— 更多的都是 后期维护的 难度不同;

——————————————————————————————————————————————————————

关于 WCF的 维护测试:

  >如果 没有标记 [DataMember] :
  >如果 部分标记  [DataContract] 和 [DataMember] —— 则未标记 属性 会丢失(不会出现在 代理类中)
  >如果 不标记任何 [DataContract] 和 [DataMember]
    >且 不标记 [Serializable] —— 完全正常
    >若 标记  [Serializable] —— 所有属性名 都会被加上 __BackingField 后缀


  >如果 增加/减少 穿透对象的属性 :
    >减少 穿透对象 属性, 但是 代理类却没有更新 —— 客户端一切正常, 减少属性 无值
    >增加 穿透对象 属性, 但是 代理类却没有跟新 —— 客户端一切正常, (代理类 ExtensionData 有增加值)


  >如果 增加/减少 服务函数 :
    >如果 增加 服务函数 :
      >如果 新函数 返回 新穿透对象, 但是 代理类却没有更新 —— 客户端 在不掉用新函数时(客户端根本就没有新函数) 一切正常
    >如果 减少 服务函数, 但是 代理类却没有更新 —— 客户端 在不调用删除函数时 一切正常


  >如果 函数参数列表 增加/减少 函数参数 :
    >增加服务函数 末尾参数, 但是 代理类却没有更新 —— 客户端一切正常, 新参数 无值 (我已经被 彻底 雷死了)
    >新增服务参数 乱序参数, 但是 代理类却没有更新 —— 客户端一切正常, 新参数 无值 (我已经被 完全 雷死了)
    >减少服务参数 任意参数, 但是 代理类却没有更新 —— 客户端一切正常, 新参数 无值 (我已经被 无语了)
    >打乱服务参数, 但是 代理类却没有更新 —— 客户端传入参数 异常 :
      >如 :
      >最开始 服务端、客户端 参数表: testArg, testArg2, testArg3
      >服务端 修改为 testArg2, testArg, testArg3 —— 则 服务端 仅有 testArg testArg3 有值
      >服务端 修改为 testArg, testArg3, testArg2 —— 则 服务端 仅有 testArg testArg2 有值


  >结论 : WCF 的 稳定性&维护性 远远超过 我之前的 预期

 

问题 :“添加服务引用” 填写好地址后 出现错误,信息如下:
下载“http://localhost:8732/Design_Time_Addresses/WcfServiceLibrary1/Service1/”时出错。
无法连接到远程服务器
由于目标计算机积极拒绝,无法连接。 127.0.0.1:8732
元数据包含无法解析的引用:“http://localhost:8732/Design_Time_Addresses/WcfServiceLibrary1/Service1/”。
没有终结点在侦听可以接受消息的 http://localhost:8732/Design_Time_Addresses/WcfServiceLibrary1/Service1/。这通常是由于不正确的地址或者 SOAP 操作导致的。如果存在此情况,请参见 InnerException 以了解详细信息。
无法连接到远程服务器
由于目标计算机积极拒绝,无法连接。 127.0.0.1:8732
如果该服务已在当前解决方案中定义,请尝试生成该解决方案,然后再次添加服务引用。

出现以上错误信息有很多种情况,首先查看配置 地址、绑定、协议是否正确?其次看一下防火墙设置是否关闭,(有一次查问题查了一天本机没问题,跨机器就有问题,最后查到是防火墙的问题)

已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性。

 

错误:已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性。

或者

错误:反序列化操作“GetAllUserData”的响应消息的正文时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。 行 1,位置 8834。

 

解决方案 :

加上红色部分即可 。

解决方案 :

 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
              <binding name="WSHttpBinding_ISyncService" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" >
                <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647"
        maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
              </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:8732/SyncService/" binding="wsHttpBinding"
                bindingConfiguration="WSHttpBinding_ISyncService" contract="SyncServiceProxy.ISyncService"
                name="WSHttpBinding_ISyncService">
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

 

WCF:(413) Request Entity Too Large.

 

使用WCF保存数据时遇到这个错误:(413)
 Request Entity Too Large。
原因是WCF默认接受的数据最大是几十KB(具体多少没有亲测过,网上有说最大64KB),一旦传给WCF函数的数据量超过这个值,就会报上面的错误。
解决方法是在WCF的服务端和客户端同时加上配置:

 

<system.serviceModel>

  <bindings>

    <basicHttpBinding>

      <binding maxReceivedMessageSize="10485760">

      </binding>

    </basicHttpBinding>

  </bindings>  

</system.serviceModel>

问题: 在IIS中部署好WCF服务站点后,本机访问服务无问题,局域网中其他电脑访问不到

 

1、问题描述

 

  在IIS中部署好WCF服务站点后,本机访问服务无问题,局域网中其他电脑访问不到。

 

2、解决方法

 

  (1)控制面板 -> Windows防火墙 -> 高级设置

 

  

 

  (2)属性

 

  

 

  (3)配置文件(我只改了“专用配置文件”)-> “入站连接”设置为“允许”

 

  

 

  

 

  设置完成后,局域网中其他电脑就可访问到部署在IIS上的WCF服务了。

 问题:解决WCF跨机器调用时发生“调用方未由服务进行身份验证”的错误

 

1、服务器端Web.config配置文件,增加如下部分:

复制代码
<system.serviceModel>
<bindings>
  <wsHttpBinding>
    <binding name="WSHttpBinding_NoneSecurity" maxBufferPoolSize="12000000" maxReceivedMessageSize="12000000" useDefaultWebProxy="false">
      <readerQuotas maxStringContentLength="12000000" maxArrayLength="12000000"/>
      <security mode="None"/>
    </binding>
  </wsHttpBinding>
</bindings>
</system.serviceModel>
复制代码

2、客户端app.config配置文件,修改或增加红色部分:

<wsHttpBinding>
  <binding name="WSHttpBinding_IService1">
    <security mode="None" />
  </binding>
</wsHttpBinding>

 

win8开发C#篇——关于调用webservice服务器发生Endpoint不监听的情况(包括WCF服务器)

wcf异常汇总

WCF技术专栏

局域网跨机访问WCF服务出错本机访问正常的问题

 

posted on 2014-07-01 17:45  Daywei  阅读(494)  评论(0编辑  收藏  举报

导航

技术追求卓越 梦想创造未来