2011-01-20 29 views
7

Bối cảnhLàm cách nào để tăng kích thước POST cho một dịch vụ web ASMX?

Tôi đang phát triển một điều khiển phía máy chủ ASP.Net cần nói chuyện với dịch vụ web ASMX. Điều khiển phía máy chủ sử dụng đối tượng WebClient để nói chuyện với dịch vụ web, vì nó cần được sử dụng lại thường xuyên trong các ứng dụng khác nhau và để làm cho các nhà phát triển dễ dàng hơn, họ không bắt buộc phải tạo tham chiếu dịch vụ cho dịch vụ web.

Thực hiện

Trong việc sử dụng sự kiểm soát, người ta đòi hỏi việc gửi một đối tượng serialized với dịch vụ web. Đối tượng được tuần tự hóa bằng cách sử dụng XmlSerializer và chuỗi XML kết quả sau đó được nén bằng cách sử dụng thư viện nén chilkat. Cuộc gọi dịch vụ web cho việc kiểm soát trông như sau:

webClient.UploadStringAsync(new Uri(serviceHost + serviceMethod), "POST", sendData)

Nội dung của sendData (string) là compressedResponse={CompressedData}.

Dịch vụ web có phương thức được xác định như sau để nhận dữ liệu và sau đó giải nén giá trị chuỗi bằng cách sử dụng thư viện chilkat trước khi hủy nối tiếp đối tượng bằng cách sử dụng XmlSerializer.

public void SaveResponse(string compressedResponse)

Các thông tin liên lạc giữa kiểm soát và các dịch vụ đang làm việc. Ban đầu không có cài đặt hoặc ràng buộc nào được xác định trong web.config cho bất kỳ điều nào ở trên. Sau khi tìm kiếm ban đầu tôi đã thêm

<httpRuntime maxRequestLength="20480"/>

cho cả client và server web.config tập tin. Điều này đã không có sự khác biệt.

Vấn đề

nén hay giải nén các dữ liệu được gửi đến dịch vụ web trong biến sendData là lớn đối với một yêu cầu POST bình thường, và là hỏng. Điều này được xác nhận khi kiểm tra vài ký tự cuối cùng của chuỗi trước và sau khi nó được đăng lên máy chủ ở định dạng nén và không nén, tài liệu Xml thiếu thẻ gốc cuối cùng khi kiểm tra trong trình gỡ lỗi. Không thể giải nén string và do đó cuộc gọi dịch vụ không thành công mỗi lần.

Làm cách nào để tăng kích thước POST cho yêu cầu WebClient để đảm bảo rằng máy chủ nhận được chuỗi đầy đủ?

Tôi đã xem xét các tùy chọn khác nhau trên Google, nhưng không có gì cho tôi mẫu đủ tốt về nơi thực hiện thay đổi hoặc mẫu của những thay đổi cần phải trông như thế nào. Tôi hoàn toàn bị mất về việc liệu thay đổi có cần phải được thực hiện trên máy chủ hoặc trang web tiêu thụ hay không và vì không có ràng buộc nào được xác định cho điều này, cách tạo liên kết trong web.config cho cuộc gọi dịch vụ ASMX HTTP.

+0

điều gì khiến bạn tin rằng chuỗi quá dài? Chỉ thực tế là nó không thể được giải nén? Nó trông như thế nào ở Fiddler? –

+0

@ John tôi đã cập nhật câu hỏi với thông tin. Thực hiện kiểm tra cơ bản trên chuỗi đã nén bằng cách sao chép vài ký tự cuối cùng trước bài đăng và xác thực nó trước chuỗi đã đăng. Ngoài ra việc gửi tài liệu Xml chưa nén cho thấy rằng thẻ gốc cuối cùng bị thiếu, và nó bị cắt giữa chừng khi kiểm tra trong trình gỡ lỗi. – BinaryMisfit

Trả lời

1

Có vẻ như không có cách nào để thay đổi kích thước POST cho dịch vụ web ASMX khi chỉ HttpPost được bật.

Giải pháp cuối cùng là chuyển đổi dịch vụ để chạy HttpSoap và tạo tham chiếu dịch vụ tới assembly có chứa điều khiển. Sau khi thực hiện ràng buộc được tạo ra bằng cách sử dụng mã trong điều khiển khi điểm cuối được thiết lập thông qua một thuộc tính.

6

Tôi tin rằng bạn phải đạt đến giới hạn độ dài tối đa yêu cầu ASP.NET. Bạn có thể sửa đổi thông qua tệp cấu hình như:

<system.web> 
    <httpRuntime executionTimeout="240" maxRequestLength="20480" /> 
</system.web> 

maxRequestGiá trị độ dài bằng KB, vì vậy cài đặt trên sẽ cho phép 20 MB. Bạn cũng có thể chỉ áp dụng cài đặt cho các URL đã chọn bằng cách sử dụng thẻ vị trí, ví dụ:

<location path="yourservice.asmx"> 
    <system.web> 
     <httpRuntime executionTimeout="240" maxRequestLength="20480" /> 
    </system.web> 
</location> 
+0

Tôi nên thêm vào câu hỏi mà tôi đã thiết lập cho cả khách hàng 'web.config' và máy chủ' web.config'. Tôi đã cập nhật câu hỏi để phản ánh điều này. 1 tuy nhiên cho câu trả lời chi tiết. – BinaryMisfit

+0

@Diago, bạn có gặp phải lỗi cụ thể nào không? Bạn có thể chia sẻ chi tiết đó không? – VinayC

+0

@Diago, tôi cũng tò mò về cách bạn đang chuyển đổi dữ liệu nén (có lẽ trong định dạng mảng byte) thành một chuỗi. Bạn cần phải áp dụng chuyển đổi ngược lại sau khi nhận. Base64 sẽ là một ứng cử viên tốt ở đây để mã hóa dữ liệu nén thành chuỗi. – VinayC

Các vấn đề liên quan