2013-08-28 23 views
8

Tôi đang sử dụng lớp HttpClient để liên lạc với một dịch vụ web trong ứng dụng WPF của tôi.C#: HttpClient, Máy chủ đã vi phạm giao thức. Section = ResponseStatusLine

Khi tôi thực hiện các yêu cầu GET liên tiếp trên cùng một kết nối, mọi thứ hoạt động tốt. Tuy nhiên, khi tôi thực hiện các yêu cầu PUT/PATCH liên tiếp trên cùng một kết nối, yêu cầu đầu tiên thực hiện chính xác và tôi nhận được phản hồi nhưng yêu cầu thứ hai không bao gồm nội dung trong yêu cầu và tôi nhận được lỗi khét tiếng của "Máy chủ đã cam kết một giao thức vi phạm. Phần = ResponseStatusLine ".

Yêu cầu của tôi hoàn tất thành công nếu tôi đóng kết nối theo cách thủ công sau mỗi yêu cầu bằng cách thêm Kết nối: đóng vào tiêu đề. "Giải pháp" này là một mô hình xấu và hiệu suất sẽ không quy mô thích hợp.

Dưới đây là một phiên bản debranded của một danh sách các Output TCP suối của tôi từ các yêu cầu được gửi:

Wireshark: Thực hiện theo TCP Suối Output

GET /domain/api/tenant/current/object?objectName=Lizbot HTTP/1.1 
Accept: application/json 

    HTTP/1.1 200 OK 
    Content-Type: application/json; charset=utf-8 
    Content-Length: 50 
    {"Data":[{"Id":123,"ObjectName":"Lizbot","Date":null}],"Errors":[]} 

PATCH /domain/api/tenant/current/object/123 HTTP/1.1 
Accept: application/json 
Content-Type: application/json; charset=utf-8 
Content-Length: 50 
{"Id":123,"ObjectName":"Lizbot","Date":null} 

    HTTP/1.1 204 No Content 
    Content-Type: application/json; charset=utf-8 
    {"Data":null,"Errors":[]} 

PATCH /domain/api/tenant/current/object/123/otherObject HTTP/1.1 
Accept: application/json 
Content-Type: application/json; charset=utf-8 

    HTTP/1.1 400 Bad Request</b> 
    Content-Type: text/html; charset=us-ascii 
    Connection: close 
    Content-Length: 311 

Chú ý rằng PATCH thứ hai thiếu đối tượng mà nó phải vá với. Nếu tôi thay đổi thứ tự của PATCHing, PATCH thứ hai vẫn còn thiếu đối tượng của nó.

Lỗi này dường như phổ biến với một số giải pháp đã biết mà tôi đã thử. Chúng bao gồm this solution liên quan đến việc đặt thuộc tính useUnsafeHeaderParsing thành TRUE và đặt thuộc tính Keep-Alive thành FALSE trong Web.Config. Tôi cũng đã thử giải pháp thiết lập các thuộc tính này theo cách này được hiển thị bên dưới:

ServicePointManager.DefaultConnectionLimit = 2; 
ServicePointManager.Expect100Continue = false; 

Không có giải pháp nào trong số này hoạt động. Cần lưu ý rằng khi sử dụng công cụ proxy gỡ lỗi Http, Fiddler, để nắm bắt các yêu cầu này, tôi không nhận được bất kỳ lỗi nào.

Vì vậy, những gì tôi yêu cầu là nếu có ai biết giải pháp tốt để giảm bớt lỗi này để tôi có thể thực hiện nhiều yêu cầu trong kết nối mà không làm mất nội dung cập nhật. Nếu cần thêm chi tiết, tôi vui lòng cung cấp chúng.

Trả lời

6

Vấn đề cơ bản là phản hồi PATCH bao gồm nội dung trong nội dung phản hồi. Đảm bảo rằng máy chủ không gửi nội dung khi gửi 204 Không có nội dung.

+0

Cảm ơn bạn! Tôi chấp nhận câu trả lời này bởi vì, mặc dù tôi sẽ ngăn chặn lỗi bị ném, điều này đảm bảo tôi không có lỗi để ném. –

+1

Mặc dù tôi đồng ý rằng việc gửi 204 với nội dung là một vi phạm giao thức, HttpClient có thể xử lý tình huống này mà không gặp bất kỳ sự cố nào. Như có thể tự lưu trữ api web. Có thể IIS làm rối tung mọi thứ. –

9

Sau nhiều lần gỡ lỗi và đọc, tôi nhận ra rằng tôi đang cố chỉnh sửa tệp Web.Config của ứng dụng WPF thay vì tệp app.config!

Vì vậy, nếu bạn thả mã này trong ứng dụng app.config vào thư mục gốc của thẻ cấu hình cho ứng dụng WPF, nó sẽ khắc phục sự cố.

<system.net> 
<settings> 
<httpWebRequest useUnsafeHeaderParsing = "true"/> 
</settings> 
</system.net> 
Các vấn đề liên quan