2011-07-06 362 views
0

我有WCF RESTful服務和Android客戶端。WCF REST服務400錯誤請求

服務器回覆400,當我做更大的請求。似乎我在here或其他數百萬個帖子中遇到了65000限制問題,如 。

但是,我似乎無法修復它。這裏是我的web.config的樣子

<system.serviceModel> 
    <diagnostics> 
     <messageLogging logMalformedMessages="true" logMessagesAtServiceLevel="true" 
     logMessagesAtTransportLevel="true" /> 
    </diagnostics> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    <standardEndpoints> 
     <webHttpEndpoint> 
     <standardEndpoint name="myEndpoint" helpEnabled="true" automaticFormatSelectionEnabled="true" maxReceivedMessageSize="1000000" /> 
     </webHttpEndpoint> 
    </standardEndpoints> 
    </system.serviceModel> 

這裏是服務功能的代碼示例:

[WebInvoke(UriTemplate = "/trips/{TripId}/inspection", Method = "POST")] 
     [Description("Used on mobile devices to submit inspections to server")] 
     public void PostTripInspection(string tripId, Inspection inspection) 
     { 
      return; 
     } 

這裏是它承載WCF(Global.asax.cs中)我的Web項目

內碼
private static void RegisterRoutes() 
     { 
      // Setup URL's for each customer 
      using (var cmc = new CoreModelContext()) 
      { 
       foreach (var account in cmc.Accounts.Where(aa => aa.IsActive).ToList()) 
       { 
        RouteTable.Routes.Add(
         new ServiceRoute(
          account.AccountId + "/mobile", new WebServiceHostFactory(), typeof(MobileService))); 
       } 
      } 
     } 

從我的理解Java HttpClient沒有強加任何限制,所以它在WCF端。任何關於如何解決這個問題的指針或如何攔截WCF中的消息?編輯2: 這是跟蹤顯示。當我modigy standardEndpoint它並不能幫助......

enter image description here

回答

0

你並不需要使用在這種情況下,流媒體 - 所有你需要做的是提高標準webHttpEndpoint的maxReceivedMessageSize配額:

<standardEndpoints> 
    <webHttpEndpoint> 
    <!-- 
     Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
     via the attributes on the <standardEndpoint> element below 
    --> 
    <standardEndpoint name="" 
         helpEnabled="true" 
         automaticFormatSelectionEnabled="true" 
         maxReceivedMessageSize="1000000"/> 
    </webHttpEndpoint> 
</standardEndpoints> 

更新:如果配置變化沒有工作(我不知道爲什麼),你可以嘗試在代碼中它增加。通過使用自定義服務主機工廠,您可以獲得對端點對象的引用,並且可以在那裏增加配額。下面的代碼顯示了一個這樣的工廠(您需要更新RegisterRoute代碼才能使用此新工廠):

public class MyWebServiceHostFactory : ServiceHostFactory 
{ 
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 
     return base.CreateServiceHost(serviceType, baseAddresses); 
    } 

    class MyWebServiceHost : WebServiceHost 
    { 
     public MyWebServiceHost(Type serviceType, Uri[] baseAddresses) 
      : base(serviceType, baseAddresses) 
     { 
     } 
     protected override void OnOpening() 
     { 
      base.OnOpening(); 
      foreach (ServiceEndpoint endpoint in this.Description.Endpoints) 
      { 
       if (!endpoint.IsSystemEndpoint) 
       { 
        Binding binding = endpoint.Binding; 
        if (binding is WebHttpBinding) 
        { 
         ((WebHttpBinding)binding).MaxReceivedMessageSize = 1000000; 
        } 
        else 
        { 
         CustomBinding custom = binding as CustomBinding; 
         if (custom == null) 
         { 
          custom = new CustomBinding(binding); 
         } 

         custom.Elements.Find<HttpTransportBindingElement>().MaxReceivedMessageSize = 1000000; 
        } 
       } 
      } 
     } 
    } 
} 
+0

這似乎是什麼,對嗎?對我有意義,但不起作用:(看到更新的主要帖子。我跑了跟蹤和YES,這個屬性似乎是問題,我想知道我需要修改什麼綁定.. – katit

+0

它應該工作,但如果它不' t,你可以嘗試我添加到答案的更新解決方案 – carlosfigueira

+0

我會將你的帖子標記爲答案,因爲你指示我回到我應該看的地方猜猜什麼?!在刪除「name =」「」後開始工作,來自終端Microsoft服務配置編輯器抱怨它,但代碼不會註冊這個配置任何名稱,標籤必須出... – katit

1

原諒我,如果你已經看到了這個鏈接(Similar StackOverflow Question):

默認情況下,WCF運輸 限於在65K發送消息。如果 要發送大需要 使流傳輸模式和 你需要增加的 大小MaxReceivedMessageSize,這是有 只是作爲一個後衛,以防止有人 通過上傳 殺死你的服務器海量文件。

所以,你可以使用綁定 配置來做到這一點,或者你可以在 代碼中做到這一點。這裏是做在 代碼的一種方式:

var endpoint = ((HttpEndpoint)host.Description.Endpoints[0]); //Assuming one endpoint 
endpoint.TransferMode = TransferMode.Streamed; 
endpoint.MaxReceivedMessageSize = 1024 * 1024 * 10; // Allow files up to 10MB 
+0

我會在哪放置該代碼? – katit

+0

有關編程設置,請參閱http://social.technet.microsoft.com/wiki/contents/articles/streaming-large-data-files-using-webhttpbinding-wcf.aspx。或者,通過web.config,嘗試將transferMode =「Streamed」添加到綁定元素。 – jglouie

+0

此鏈接不顯示配置終端的位置。但無論如何,我認爲這是不正確的方向。我的Android客戶端使用普通的POST,沒有涉及流媒體。它只是發佈大json字符串.. – katit

相關問題