一、建立時,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>