(413) Thực thể yêu cầu quá lớn | tải lênReadAheadSize


136

Tôi đã viết một dịch vụ WCF với .NET 4.0, được lưu trữ trên x64hệ thống Windows 7 Ultimate của tôi với IIS 7.5. Một trong các phương thức dịch vụ có một 'đối tượng' làm đối số và tôi đang cố gửi một byte [] có chứa một hình ảnh. Miễn là kích thước tập tin của hình ảnh này là ít hơn khoảng. 48KB, tất cả đều tốt. Nhưng nếu tôi đang cố tải lên một hình ảnh lớn hơn, dịch vụ WCF sẽ trả về một lỗi: (413) Request Entity Too Large. Vì vậy, tôi đã dành 3 giờ để thông báo lỗi và mọi chủ đề tôi thấy về chủ đề này đều gợi ý việc tăng thuộc tính 'uploadReadAheadSize'. Vì vậy, những gì tôi đã làm là sử dụng các lệnh sau (10485760 = 10MB):

"appcmd.exe set config -section:system.webserver/serverruntime/uploadreadaheadsize: 10485760 /commit:apphost"

"cscript adsutil.vbs set w3svc/<APP_ID>/uploadreadaheadsize 10485760"

Tôi cũng đã sử dụng Trình quản lý IIS để đặt giá trị bằng cách mở trang web và đi đến "Trình chỉnh sửa cấu hình" trong phần Quản lý. Thật không may, tôi vẫn nhận được lỗi Thực thể yêu cầu quá lớn và nó thực sự gây khó chịu!

Vì vậy, có ai biết những gì khác tôi có thể cố gắng khắc phục lỗi này?


6
10485760 = 10MB, không phải 1MB
Shaun Rowan

Câu trả lời:


206

Đó không phải là vấn đề của IIS mà là vấn đề của WCF. WCF theo mặc định giới hạn các tin nhắn ở mức 65KB để tránh bị tấn công từ chối dịch vụ với các tin nhắn lớn. Ngoài ra, nếu bạn không sử dụng MTOM, nó sẽ gửi byte [] đến chuỗi được mã hóa base64 (tăng kích thước 33%) => 48KB * 1,33 = 64KB

Để giải quyết vấn đề này, bạn phải cấu hình lại dịch vụ của mình để chấp nhận các tin nhắn lớn hơn. Vấn đề này trước đây đã gây ra 400 lỗi Yêu cầu xấu nhưng trong phiên bản mới hơn WCF bắt đầu sử dụng 413, đây là mã trạng thái chính xác cho loại lỗi này.

Bạn cần thiết lập maxReceivedMessageSizeràng buộc của bạn. Bạn cũng có thể cần phải thiết lập readerQuotas.

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding maxReceivedMessageSize="10485760">
        <readerQuotas ... />
      </binding>
    </basicHttpBinding>
  </bindings>  
</system.serviceModel>

8
tôi đã đặt maxRecperedMessageSize thành giá trị trên nhưng tôi vẫn nhận được cùng một lỗi .. Yêu cầu thực thể quá lớn ..
Sandepku

11
@ Sandepku- Chỉ trong trường hợp ... Tôi đã gặp vấn đề tương tự trong một thời gian dài và sau đó nhận ra rằng tôi đã đặt tên sai cho Binding Name, vì vậy WCF đã sử dụng các giá trị mặc định thay vì các giá trị cấu hình của tôi và cung cấp cho tôi chính xác cùng một lỗi.
Adrian Carr

1
tôi đã đặt maxRecperedMessageSize thành giá trị trên nhưng tôi vẫn nhận được cùng một lỗi .. Yêu cầu thực thể quá lớn. Tên ràng buộc không trống. Cứu giúp!
NetSide

2
Cảm ơn ngài, điều này rất hữu ích ngay lập tức! Đặt giá trị mới cho maxReceuredMessageSize yêu cầu cùng giá trị được đặt cho maxBufferSize.
DiligentKarma

1
@Sandepku nếu bạn đang sử dụng webhttpbinding cho REST, thì bạn có thể cần đặt tên ràng buộc trong <
bind

55

Tôi gặp vấn đề tương tự với IIS 7.5 với Dịch vụ WCF REST. Cố gắng tải lên qua POST bất kỳ tệp nào trên 65k và nó sẽ trả về Lỗi 413 "Thực thể yêu cầu quá lớn".

Điều đầu tiên bạn cần hiểu là loại ràng buộc nào bạn đã cấu hình trong web.config. Đây là một bài viết tuyệt vời ...

BasicHttpBinding vs WsHttpBinding vs WebHttpBinding

Nếu bạn có dịch vụ REST thì bạn cần định cấu hình nó là "webHttpBinding". Đây là cách khắc phục:

<system.serviceModel>

<bindings>
   <webHttpBinding>
    <binding 
      maxBufferPoolSize="2147483647" 
      maxReceivedMessageSize="2147483647" 
      maxBufferSize="2147483647" transferMode="Streamed">
    </binding>  
   </webHttpBinding>
</bindings>

2
Cảm ơn, điều này đã làm việc với tôi khi sử dụng IIS 7.5 với dịch vụ WCF REST. Trong thực tế, tôi chỉ phải sửa đổi thuộc tính maxReceuredMessageSize.
Alex Yuly

Tôi đã có maxReceuredMessageSize, maxBufferSize đã thực hiện thủ thuật, maxBufferPoolSize hiển thị là một thuộc tính không hợp lệ.
JabberwockyDecompiler

4
đảm bảo bạn xác định tên ràng buộc và làm cho nó bằng với ràng buộc ràng buộc trên điểm cuối. Ví dụ: <ràng buộc tên = "restLargeBinding" maxBufferPoolSize = ..........>. Và trong cấu hình dịch vụ; <endpoint address = "" bind = "webHttpBinding" bindConfiguration = "restLargeBinding" .......
smoothumut 21/07/2015

2
hoạt động rất tốt, mặc dù cài đặt transferMode = "Streamed" đã cho tôi một yêu cầu không tốt, đã phải xóa yêu cầu đó
WtFudgE

1
@smoothumut Tôi biết nó đã cũ, nhưng ràng buộcConfiguration = "restLargeBinding" đã lừa tôi! Nhân tiện, tôi đang sử dụng dịch vụ wcf tự lưu trữ.
ramires.cabral

26

Tôi đã có cùng một vấn đề và thiết lập uploadReadAheadSizegiải quyết nó:

http://www.iis.net/configreference/system.webserver/serverr Yoon

"Giá trị phải nằm trong khoảng từ 0 đến 2147483647."

Bạn có thể dễ dàng đặt nó trong apphost.config-fle nếu bạn không muốn làm điều đó.

Nó nằm ở WindowsFOLDER\System32\inetsrv\config(máy chủ 2008).

Bạn phải mở nó bằng notepad. Làm một bản sao lưu của tập tin đầu tiên.

Theo các nhận xét trong cấu hình, cách được đề xuất để mở khóa các phần là sử dụng thẻ vị trí:

<location path="Default Web Site" overrideMode="Allow">
    <system.webServer>
        <asp />
    </system.webServer>
</location>"

Vì vậy, bạn có thể viết ở phía dưới (vì nó không tồn tại trước đó). Tôi viết maxvalueở đây - viết giá trị của riêng bạn nếu bạn muốn.

<location path="THENAMEOFTHESITEYOUHAVE" overrideMode="Allow">
    <system.webServer>
        <asp />
        <serverRuntime uploadReadAheadSize="2147483647" />
    </system.webServer>
</location>

Nếu bạn đặt nó trước khi </configuration>ví dụ, bạn biết bạn có nó ở đâu.

Hy vọng rằng giải quyết vấn đề của bạn. Đó là một vấn đề về SSL đối với tôi, khi có quá nhiều bài đăng đóng băng ứng dụng, gây ra lỗi (413) Thực thể yêu cầu quá lớn .


1
Đã được đặt maxReceivedMessageSizethành int.MaxValue, điều này đã tạo ra mánh khóe. Tôi tự hỏi liệu có bất kỳ mối quan tâm lớn nào với việc đặt tùy chọn này thành int.MaxValue không?
Langdon

2
Có ai biết nếu uploadReadAheadSize cũng có liên quan đến các dịch vụ WCF tự lưu trữ, không chạy qua IIS không? tức là đây cũng là một vấn đề liên quan đến Windows Server nói chung?
antscode

@antscode Tôi có một api tự lưu trữ và chịu cùng một vấn đề - bạn đã giải quyết nó với dịch vụ tự lưu trữ của mình chưa?
Trevor Daniel

17

Tôi đã nhận được thông báo lỗi này, mặc dù tôi đã maxcài đặt cài đặt trong ràng buộc của tệp cấu hình dịch vụ WCF của mình:

<basicHttpBinding>
        <binding name="NewBinding1"
                 receiveTimeout="01:00:00"
                 sendTimeout="01:00:00"
                 maxBufferSize="2000000000"
                 maxReceivedMessageSize="2000000000">

                 <readerQuotas maxDepth="2000000000"
                      maxStringContentLength="2000000000"
                      maxArrayLength="2000000000" 
                      maxBytesPerRead="2000000000" 
                      maxNameTableCharCount="2000000000" />
        </binding>
</basicHttpBinding>

Dường như các cài đặt ràng buộc này không được áp dụng, do đó, thông báo lỗi sau:

IIS7 - (413) Thực thể yêu cầu quá lớn khi kết nối với dịch vụ.

.

Vấn đề

Tôi nhận ra rằng các name=""thuộc tính trong <service>thẻ của web.configkhông một trường văn bản miễn phí, như tôi nghĩ rằng nó là. Đó là tên đầy đủ của việc thực hiện hợp đồng dịch vụ như được đề cập trong trang tài liệu này .

Nếu điều đó không phù hợp, thì cài đặt ràng buộc sẽ không được áp dụng!

<services>
  <!-- The namespace appears in the 'name' attribute -->
  <service name="Your.Namespace.ConcreteClassName">
    <endpoint address="http://localhost/YourService.svc"
      binding="basicHttpBinding" bindingConfiguration="NewBinding1"
      contract="Your.Namespace.IConcreteClassName" />
  </service>
</services>

Tôi hy vọng rằng sẽ cứu ai đó một chút đau đớn ...


1
Cảm ơn đã thêm giải pháp này! Một cách gián tiếp giải quyết vấn đề của tôi ở chỗ tên hợp đồng của tôi đã thay đổi trong dev nhưng thay đổi không được triển khai để sản xuất đúng cách. Việc kiểm tra các cài đặt này đã giải quyết (413) Thực thể yêu cầu của tôi Lỗi quá lớn do sử dụng cài đặt kích thước thư mặc định.
Doug Knudsen

Tôi thực sự vui mừng vì điều này đã giúp được ai đó. Tôi đã dành một khoảng thời gian tốt cho việc này vì vậy tôi hy vọng nó sẽ làm cho ngày của ai đó bớt đau khổ.
Lu-ca

9

Nếu bạn đang gặp phải vấn đề này mặc dù đã thử tất cả các giải pháp trong chuỗi này và bạn đang kết nối với dịch vụ qua SSL (ví dụ https), điều này có thể giúp:

http://forums.newatlanta.com/messages.cfm?threadid=554611A2-E03F-43DB-92F996F4B6222BC0&#top

Để tóm tắt (trong trường hợp liên kết chết trong tương lai), nếu yêu cầu của bạn đủ lớn, việc đàm phán chứng chỉ giữa khách hàng và dịch vụ sẽ thất bại ngẫu nhiên. Để tránh điều này xảy ra, bạn sẽ cần bật một cài đặt nhất định trên các ràng buộc SSL của mình. Từ máy chủ IIS của bạn, đây là các bước bạn cần thực hiện:

  1. Qua cmd hoặc powershell, chạy netsh http show sslcert . Điều này sẽ cung cấp cho bạn cấu hình hiện tại của bạn. Bạn sẽ muốn lưu cái này bằng cách nào đó để bạn có thể tham khảo lại sau.
  2. Bạn nên chú ý rằng "Thương lượng chứng chỉ khách hàng" bị vô hiệu hóa. Đây là thiết lập vấn đề; các bước sau đây sẽ trình bày cách kích hoạt nó.
  3. Thật không may, không có cách nào để thay đổi các ràng buộc hiện có; bạn sẽ phải xóa nó và thêm lại nó. Chạy đi netsh http delete sslcert <ipaddress>:<port>đâu<ipaddress>:<port> là cổng IP: được hiển thị trong cấu hình bạn đã lưu trước đó.
  4. Bây giờ bạn có thể thêm lại các ràng buộc. Bạn có thể xem các tham số hợp lệ netsh http add sslcert tại đây (MSDN) nhưng trong hầu hết các trường hợp, lệnh của bạn sẽ trông như thế này:

netsh http add sslcert ipport=<ipaddress>:<port> appid=<application ID from saved config including the {}> certhash=<certificate hash from saved config> certstorename=<certificate store name from saved config> clientcertnegotiation=enable

Nếu bạn có nhiều ràng buộc SSL, bạn sẽ lặp lại quy trình cho từng ràng buộc. Hy vọng rằng điều này sẽ giúp cứu người khác hàng giờ và đau đầu vấn đề này gây ra cho tôi.

EDIT: Theo kinh nghiệm của tôi, bạn thực sự không thể chạy netsh http add sslcertlệnh từ dòng lệnh trực tiếp. Trước tiên, bạn cần nhập dấu nhắc Netsh bằng cách nhập netshvà sau đó đưa ra lệnh của bạn như thế nào http add sslcert ipport=...để nó hoạt động.


Cảm ơn bạn đã đăng bài, nó đã giúp cô lập vấn đề cho chúng tôi, tắt SSL loại bỏ lỗi WCF. Thật không may, quá trình phân tích khách hàng đã không thay đổi kết quả của chúng tôi để hoạt động trên SSL. Stil đang tìm kiếm các bit khác để chuyển đổi :-(
Jafin

8

Điều này giúp tôi giải quyết vấn đề (một dòng - tách để có thể đọc / khả năng sao chép):

C:\Windows\System32\inetsrv\appcmd  set config "YOUR_WEBSITE_NAME" 
     -section:system.webServer/serverRuntime /uploadReadAheadSize:"2147483647" 
     /commit:apphost

bạn đang lưu trữ WCF của bạn trong môi trường SharePoint? và bạn có phải khởi động lại IIS sau khi áp dụng các thay đổi không?
theITideo

2

Đối với tôi, thiết lập uploadReadAheadSize thành int.MaxValue cũng đã khắc phục sự cố, sau khi cũng tăng các giới hạn đối với ràng buộc WCF.

Dường như, khi sử dụng SSL, toàn bộ thực thể yêu cầu được tải sẵn, mà thuộc tính metabase này được sử dụng.

Để biết thêm thông tin, xem:

Trang không được hiển thị vì thực thể yêu cầu quá lớn. i7


1
Phát hiện của bạn về SSL và 'uploadReadAheadSize' là rất tốt! .. Nhưng tôi không khuyên bạn nên đặt nó thành giá trị tối đa
Người học

1

Đối với bất kỳ ai khác đang tìm kiếm lỗi IIS WCF 413: Yêu cầu thực thể lớn và sử dụng dịch vụ WCF trong Sharepoint, đây là thông tin dành cho bạn. Các cài đặt trong máy chủ ứng dụng và web.config được đề xuất trong các trang web / bài đăng khác không hoạt động trong SharePoint nếu sử dụng NhiềuBaseAddressBasicHttpBindingServicehostFactory. Bạn có thể sử dụng SP Powershell để nhận dịch vụ SPWebService.Content, tạo đối tượng SPWcvSinstall mới và cập nhật cài đặt như trên cho dịch vụ của bạn (chúng sẽ không tồn tại). Hãy nhớ chỉ sử dụng tên của dịch vụ (ví dụ: [mineervice.svc]) khi tạo và thêm cài đặt. Xem trang web này để biết thêm thông tin https://robertsep.wordpress.com/2010/12/21/set-maximum-upload-filesize-sharepoint-wcf-service


1

Trong trường hợp của tôi, tôi đã phải tăng "Kích thước tin nhắn nhận được tối đa" của Vị trí nhận trong BizTalk. Giá trị đó cũng có giá trị mặc định là 64K và vì vậy mọi tin nhắn đã được BizTAlk trả về bất kể tôi định cấu hình gì trong web.config


1

Tôi đã có thể giải quyết vấn đề này bằng cách thực hiện một cuộc gọi giả (ví dụ IsAlive trả về đúng) ngay trước yêu cầu có nội dung lớn trên cùng một kênh / máy khách wcf. Rõ ràng đàm phán ssl được thực hiện trong cuộc gọi đầu tiên. Vì vậy, không cần phải tăng Uploadreadaheadsize.


0

đối với sự cố, máy chủ từ xa đã trả về phản hồi không mong muốn: (413) Yêu cầu Thực thể quá lớn trên WCF với Resful

vui lòng xem cấu hình giải thích của tôi

</client>
<serviceHostingEnvironment multipleSiteBindingsEnabled="false" aspNetCompatibilityEnabled="true"/>

<bindings>

   <!-- this for restfull service -->
  <webHttpBinding>
    <binding name="RestfullwebHttpBinding"
      maxBufferPoolSize="2147483647"
      maxReceivedMessageSize="2147483647"
      maxBufferSize="2147483647" transferMode="Streamed">

      <readerQuotas 
        maxDepth="2147483647" 
        maxStringContentLength="2147483647"
        maxArrayLength="2147483647" 
        maxBytesPerRead="2147483647" /> 

    </binding>
  </webHttpBinding>
  <!-- end -->

   <!-- this for Soap v.2 -->
  <wsHttpBinding>
    <binding name="wsBinding1" maxReceivedMessageSize="2147483647" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
      <!--UsernameToken over Transport Security-->
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" establishSecurityContext="true"/>
      </security>
    </binding>
  </wsHttpBinding>
   <!-- this for restfull service -->

   <!-- this for Soap v.1 -->
  <basicHttpBinding>
    <binding name="basicBinding1" maxReceivedMessageSize="2147483647" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false" transferMode="Streamed">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
      <security mode="None"/>
    </binding>
  </basicHttpBinding>
</bindings> 
<!-- end -->

<services>
  <clear/>

  <service name="ING.IWCFService.CitisecHashTransfer"  >
    <endpoint address="http://localhost:8099/CitisecHashTransfer.svc"
                  behaviorConfiguration="RestfullEndpointBehavior"
                  binding="webHttpBinding"
                  bindingConfiguration="RestfullwebHttpBinding"
                  name="ICitisecHashTransferBasicHttpBinding"
                  contract="ING.IWCFService.ICitisecHashTransfer" />
  </service>

</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehavior">
      <serviceMetadata httpsGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>

      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="ING.IWCFService.IWCFServiceValidator, ING.IWCFService"/>
      </serviceCredentials>
      <serviceSecurityAudit auditLogLocation="Application" serviceAuthorizationAuditLevel="SuccessOrFailure" messageAuthenticationAuditLevel="SuccessOrFailure"/>
      <serviceThrottling maxConcurrentCalls="1000" maxConcurrentSessions="100" maxConcurrentInstances="1000"/>

    </behavior>
    <behavior>
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="EndpointBehavior">
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
    </behavior> 
    <behavior name="RestfullEndpointBehavior">
      <dataContractSerializer maxItemsInObjectGraph="2147483647"  />
      <webHttp/>
    </behavior> 
  </endpointBehaviors>
</behaviors>


0

Trong trường hợp của tôi, tôi đã nhận được thông báo lỗi này vì tôi đã thay đổi không gian tên của dịch vụ và thẻ dịch vụ được trỏ đến không gian tên cũ hơn. Tôi đã làm mới không gian tên và lỗi không xuất hiện:

<services>
  <service name="My.Namespace.ServiceName"> <!-- Updated name -->
    <endpoint address="" 
              binding="wsHttpBinding" 
              bindingConfiguration="MyBindingConfiguratioName" 
              contract="My.Namespace.Interface" <!-- Updated contract -->
    />
  </service>
</services>

0

Có một lỗi tương tự trên IIS Express với Visual Studio 2017.

Lỗi HTTP 413.0 - Thực thể yêu cầu quá lớn

Trang không được hiển thị vì thực thể yêu cầu quá lớn.

Nguyên nhân rất có thể:

  • Máy chủ Web từ chối phục vụ yêu cầu vì thực thể yêu cầu quá lớn.

  • Máy chủ Web không thể phục vụ yêu cầu vì nó đang cố gắng đàm phán chứng chỉ ứng dụng khách nhưng thực thể yêu cầu quá lớn.

  • URL yêu cầu hoặc ánh xạ vật lý tới URL (nghĩa là đường dẫn hệ thống tệp vật lý đến nội dung của URL) quá dài.

Những điều bạn có thể thử:

  • Xác nhận rằng yêu cầu là hợp lệ.

  • Nếu sử dụng chứng chỉ ứng dụng khách, hãy thử:

    • Tăng system.webServer/serverR nb@uploadReadAheadSize

    • Định cấu hình điểm cuối SSL của bạn để đàm phán chứng chỉ ứng dụng khách như là một phần của bắt tay SSL ban đầu. (Netsh http thêm sslcert ... clientcertnegotiation = enable) .vs \ config \ applicationationhost.config

Giải quyết điều này bằng cách chỉnh sửa \.vs\config\applicationhost.config. Chuyển serverRuntimetừ Denyđể Allownhư thế này:

<section name="serverRuntime" overrideModeDefault="Allow" />

Nếu giá trị này không được chỉnh sửa, bạn sẽ gặp lỗi như thế này khi cài đặt uploadReadAheadSize:

Lỗi HTTP 500.19 - Lỗi máy chủ nội bộ

Không thể truy cập trang được yêu cầu vì dữ liệu cấu hình liên quan cho trang không hợp lệ.

Phần cấu hình này không thể được sử dụng tại đường dẫn này. Điều này xảy ra khi phần bị khóa ở cấp độ cha. Khóa theo mặc định (overrideModeDefault = "Deny") hoặc được đặt rõ ràng bằng thẻ vị trí với overrideMode = "Deny" hoặc legacy allowOverride = "false".

Sau đó chỉnh sửa Web.configvới các giá trị sau:

<system.webServer>
  <serverRuntime uploadReadAheadSize="10485760" />
...

Nếu bạn bỏ phiếu xuống, xin vui lòng nói tại sao. Rất khó để cải thiện câu trả lời khác.
Ogglas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.