天天看點

WCF常見問題

一、建立時,WCF Service中HttpContext.Current為null的解決辦法

1. 在hosting WCF的web.config中加入:

<system.serviceModel>

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

</system.serviceModel>

2. 在Service的類定義上加上下面Attribute:

[AspNetCompatibilityrequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

二、錯誤提示:調用方未由服務進行身份驗證。

修改WCF服務的config檔案system.serviceModel下添加配置:

<bindings>

<wsHttpBinding>

    <binding name="bindingConfiguration1">

      <security mode="None">

        <transport clientCredentialType="None"/>

        <message clientCredentialType="None"/>

      </security>

    </binding>

</wsHttpBinding>

</bindings>

    </system.serviceModel>

</configuration>

并修改behaviors下的endpoint,添加bindingConfiguration="bindingConfiguration1"

三、已超過傳入消息(65536)的最大消息大小配額

解決方案1:調用方的代碼裡加入:

(client.Endpoint.Binding as WSHttpBinding).MaxReceivedMessageSize = int.MaxValue;

解決方案2:修改用戶端調用方的Config配置檔案:

<system.serviceModel>

    <bindings>

        <wsHttpBinding>

            <binding maxReceivedMessageSize="65536000"

四、調用時服務端傳回400 Bad Request錯誤

解決方案:修改服務端的Config配置檔案,增加maxReceivedMessageSize設定:

<system.serviceModel>

    <bindings>

        <wsHttpBinding>

            <binding name="bindingConfiguration1" maxReceivedMessageSize="2147483647"

五、 無法打開安全通道,因為與遠端終結點的安全協商已失敗。

這可能是由于用于建立通道的 EndpointAddress 中不存在 EndpointIdentity 或錯誤指定了 EndpointIdentity。請确認由 EndpointAddress 指定或暗示的 EndpointIdentity 正确辨別了遠端終結點。

這個錯誤通常是服務端相關配置修改了,删除引用,重新添加引用即可

六、接收對 http://xxx.svc 的 HTTP 響應時發生錯誤。

這可能是由于服務終結點綁定未使用 HTTP 協定造成的。這還可能是由于伺服器中止了 HTTP 請求上下文(可能由于服務關閉)所緻。有關詳細資訊,請參閱伺服器日志。

1、沒有重新生成代理檔案

2、這是因為WCF傳回值無法序列化造成的

WCF的方法,不能傳回Object、ICollection、IList之類的不明确的資料類型,但是IList<string>這樣的類型可以傳回,如果傳回IList<SimpleSoft>這樣的自定義類型,需要在接口上增加KnownType,如:

[ServiceContract]

[ServiceKnownType(typeof(SimpleSoft))]

public interface ISearchService

七、格式化程式嘗試對消息反序列化時引發異常: 嘗試對參數 http://tempuri.org/ 進行反序列化時出錯: 方法名。

InnerException 消息是“在行 1、位置 1485 出現錯誤。 元素“http://schemas.datacontract.org /2004/07/父類”含有“http://schemas.datacontract.org/2004/07/子類”資料協定的資料。反序列化程式 不知道映射到此協定的類型。請将與“子類”對應的類型添加到已知類型的清單中,例如,通過使用 KnownTypeAttribute 屬性或通過将其添加到傳遞給 DataContractSerializer 的已知類型的清單等方法。”。有關詳細資訊,請參閱 InnerException。

接口傳回父類,但是實際傳回的是子類,就會出現這個錯誤,解決方法,在父類定義上添加屬性,如:

[KnownType(typeof(FullSoft))]

public class SimpleSoft

八、讀取 XML 資料時,超出最大字元串内容長度配額 (8192)。

通過更改在建立 XML 讀取器時所使用的 XmlDictionaryReaderQuotas 對象的 MaxStringContentLength 屬性,可增加此配額。

解決方案:修改用戶端的Config配置檔案,增加maxStringContentLength設定:

<system.serviceModel>

    <bindings><wsHttpBinding><binding name=""....>

<readerQuotas maxStringContentLength="2147483647"

九、無 法激活服務,因為它不支援 ASP.NET 相容性。已為此應用程式啟用了 ASP.NET 相容性。請在 web.config 中關閉 ASP.NET 相容性模式或将 AspNetCompatibilityRequirements 屬性添加到服務類型且同時将 RequirementsMode 設定為“Allowed”或“Required”。

解決辦法:

修改相應   服務.svc.cs

using System.ServiceModel.Activation ;

[AspNetCompatibilityRequirements (RequirementsMode=AspNetCompatibilityRequirementsMode.Required)]

十、WCF接口的參數,如果是枚舉值,則必須是已經定義的枚舉,比如枚舉定義:

enum aaa{aa=1, bb=2} 如果參數有aaa類型,傳遞3就會出錯,因為枚舉定義裡沒有3

如果枚舉定義加上Flags屬性,就可以傳遞3了(等于是aaa.aa | aaa.bb)

[Flags]

enum aaa{aa=1, bb=2}

十一、作為WCF接口的參數,其成員必須有public的set屬性,否則不會傳遞,比如下面的a參數可以在wcf中使用,下面的b參數無法使用:

public aaa{

    public int a{get;set;}

    public int b{get;private set;}

}

十二、System.ArgumentException: 此集合已經包含方案 http 的位址。此集合中每個方案中最多隻能包含一個位址。

WCF 針對每個schema隻支援一個綁定,是以站點不能綁定多個主機頭來使用WCF,如果綁定多個主機頭,可以在Web.config裡配置,但是如下配置後,其它主機頭無法使用這個wcf:

<serviceHostingEnvironment>

    <baseAddressPrefixFilters>

        <add prefix="http://www.example.com"/>

    </baseAddressPrefixFilters>

</serviceHostingEnvironment>