Máy chủ đã vi phạm giao thức. Section = ResponseStatusLine ERROR


115

Tôi đã tạo một chương trình, cố gắng đăng một chuỗi trên một trang web và tôi gặp lỗi này:

"Máy chủ đã vi phạm giao thức. Section = ResponseStatusLine"

sau dòng mã này:

gResponse = (HttpWebResponse)gRequest.GetResponse(); 

Làm cách nào để khắc phục ngoại lệ này?

Câu trả lời:


71

Hãy thử đưa cái này vào app / web.config của bạn:

<system.net>
    <settings>
        <httpWebRequest useUnsafeHeaderParsing="true" />
    </settings>
</system.net>

Nếu điều này không hiệu quả, bạn cũng có thể thử đặt thuộc KeepAlivetính thành false.


3
Tôi có 6 url gặp lỗi này. Thiết useUnsafeHeaderParsing cố định nó cho một liên kết, nhưng thiết KeepAlive = false cố định nó cho tất cả 6.
David Hammond

3
Điều tương tự có thể được đặt bên trong thẻ gốc <configuration> tại App.copnfig cho các ứng dụng không phải web (ví dụ: tôi đã sửa ứng dụng WPF theo cách đó - cảm ơn!).
Yury Schkatula,

có ai biết tại sao biện pháp an toàn này được áp đặt bởi IIS? Nó hoạt động, nhưng tôi không hiểu lý do hạn chế giá trị tiêu đề (đặt chúng theo cách thủ công trong trường hợp của tôi).
emran

26
Điều này chỉ đơn thuần là tránh vấn đề hơn là thực sự sửa chữa nó. Tôi nghĩ rằng đây không phải là giải pháp mặc định.
Tobias

4
Đồng ý với Tobias - bạn đang tránh được vấn đề. Bây giờ có thể sự cố nằm trong một máy chủ mà bạn không thể khắc phục được và do đó tránh có thể là lựa chọn duy nhất của bạn ... nhưng chúng ta hãy hiểu rõ về sự khác biệt giữa việc tránh lỗi giao thức và thực sự sửa lỗi.
metaforge

58

Đôi khi lỗi này xảy ra khi UserAgenttham số yêu cầu trống (trong trường hợp của tôi là github.com api).

Đặt tham số này thành chuỗi không trống tùy chỉnh đã giải quyết được vấn đề của tôi.


5
Ah đây là những gì tôi cần. Cảm ơn. Dưới đây là một ví dụ user-agent: stackoverflow.com/a/15144495/891976
David Ruhmann

Một dòng nhanh chóng để sử dụng với WebClientđây stackoverflow.com/a/11841680/4795214

5
Cảm ơn. Nếu bạn muốn truy vấn GitHub qua dòng HttpClient add: client.DefaultRequestHeaders.Add("User-Agent", "Anything");để sửa.
Cihan Yakar

32

Thủ phạm trong trường hợp của tôi là trả lại một No Contentphản hồi nhưng xác định một cơ quan phản hồi cùng một lúc. Mong câu trả lời này nhắc nhở tôi và có thể những người khác không trả lại NoContentcâu trả lời bằng cơ thể nữa.

Hành vi này phù hợp với 10.2.5 204 Không có nội dung của đặc tả HTTP có nội dung :

Phản hồi 204 KHÔNG ĐƯỢC bao gồm nội dung thông báo và do đó luôn được kết thúc bằng dòng trống đầu tiên sau các trường tiêu đề.


Chỉ cần đọc phần này sau khi tôi gặp The server committed a protocol violation. Section=ResponseStatusLine lỗi khi sử dụng WebApi để trả về NoContent()phản hồi tùy chỉnh đang gửi No Contenttrong phản hồi vì một số lý do kỳ lạ! Khi tôi giải quyết vấn đề đó, vấn đề đã biến mất :)
Intrepid

2
Đây cũng là vấn đề của tôi, mặc dù nó rất phức tạp vì lệnh gọi SAU KHI phản hồi Không có Nội dung không thành công.
mdickin

Đã sửa bằng cách xóa someContentkhỏi return Request.CreateResponse(HttpStatusCode.NoContent, someContent); +1
snippetkid

12

Một khả năng khác: khi thực hiện ĐĂNG, máy chủ phản hồi với 100 tiếp tục theo cách không chính xác.

Điều này giải quyết các vấn đề đối với tôi:

request.ServicePoint.Expect100Continue = false;

Điều này đã hiệu quả với tôi khi truy cập API MediaFire.
AlexPi

3
Tôi biết tôi đến muộn, nhưng, bạn có nghĩa là "một cách không chính xác" là gì?
kuskmen 13:17

1
Đối với bất cứ ai sử dụng HttpClient , sau đây làm việc cho tôi:var http = new HttpClient(); http.DefaultRequestHeaders.ExpectContinue = false;
user2444499

9

Điều này đã xảy ra với tôi khi tôi chạy Skype trên máy cục bộ của mình. Ngay sau khi tôi đóng cửa, ngoại lệ đã biến mất.

Ý tưởng được phép của trang này


Có cùng một vấn đề. Hóa ra là Skype. Thật không may là không thể cung cấp thông điệp thích hợp.
jordan koskei

bạn thực sự không cần phải đóng Skype, tôi đã thêm một câu trả lời bên dưới cho điều này để chỉ ra cách giải quyết nó mà không cần đóng Skype.
AltF4_ Ngày

8

Một cách để gỡ lỗi này (và để đảm bảo rằng đó là vi phạm giao thức gây ra sự cố), là sử dụng Fiddler (Http Web Proxy) và xem liệu có xảy ra lỗi tương tự hay không. Nếu nó không (tức là Fiddler đã xử lý sự cố cho bạn) thì bạn có thể sửa nó bằng cách sử dụng cờ UseUnsafeHeaderParsing.

Nếu bạn đang tìm cách đặt giá trị này theo chương trình, hãy xem các ví dụ ở đây: http://o2platform.wordpress.com/2010/10/20/dealing-with-the-server-commiss-a-protocol-violation-sectionresponsestatusline /


Fiddler thực sự đang khắc phục sự cố mà tôi gặp phải với yêu cầu GET HTTP. Chúng ta có thể xem những gì được thực hiện bởi fiddler?
Olivier MATROT

8

Nhiều giải pháp nói về một cách giải quyết, nhưng không nói về nguyên nhân thực sự của lỗi.

Một nguyên nhân có thể gây ra lỗi này là nếu máy chủ web sử dụng mã hóa khác với ASCIIhoặc ISO-8859-1để xuất phần phản hồi tiêu đề. Lý do sử dụng ISO-8859-1sẽ là nếuResponse-Phrase chứa các ký tự Latinh mở rộng.

Một nguyên nhân khác có thể gây ra lỗi này là nếu một máy chủ web sử dụng UTF-8kết quả đầu ra byte-order-marker (BOM). Ví dụ, hằng số mặc định Encoding.UTF8xuất ra BOM và bạn rất dễ quên điều này. Các trang web sẽ hoạt động bình thường trong Firefox và Chrome, nhưng HttpWebRequestsẽ bị đánh bom :). Một cách khắc phục nhanh chóng là thay đổi máy chủ web để sử dụng mã hóa UTF-8 không xuất ra BOM, ví dụ: new UTF8Encoding(false)(điều này là OK miễn là Response-Phrasechỉ chứa các ký tự ASCII, nhưng thực sự nó nên sử dụng ASCIIhoặc ISO-8859-1cho các tiêu đề và sau đó UTF-8hoặc một số mã hóa khác cho phản hồi).


Đây là phản ứng tốt nhất. Nó giải thích tại sao máy chủ web hoạt động sai. Cảm ơn! (Tôi có để mô phỏng một máy chủ web với ổ cắm vì những vấn đề triển khai với HttpListener.)
Andrew Rondeau

6

Cài đặt kỳ vọng 100 tiếp tục sai và giảm thời gian không hoạt động của ổ cắm xuống còn hai giây đã giải quyết được sự cố cho tôi

ServicePointManager.Expect100Continue = false; 
ServicePointManager. MaxServicePointIdleTime = 2000; 

6

Skype là nguyên nhân chính gây ra sự cố của tôi:

Lỗi này thường xảy ra khi bạn đã thiết lập Visual Studio để gỡ lỗi ứng dụng web hiện có đang chạy trong IIS thay vì ASP.NET được tích hợp sẵn máy chủ web gỡ lỗi . IIS theo mặc định sẽ lắng nghe các yêu cầu web trên cổng 80. Trong trường hợp này, một ứng dụng khác đã lắng nghe các yêu cầu trên cổng 80. Thông thường, ứng dụng vi phạm là Skype, theo mặc định sẽ tiếp nhận các yêu cầu trên cổng 80 và 443 khi được cài đặt. Skype đã chiếm cổng 80. Vì vậy, IIS không thể khởi động.

Để giải quyết vấn đề, hãy làm theo các bước:

Skype -> Công cụ -> Tùy chọn -> Nâng cao -> Kết nối:

Bỏ chọn "Sử dụng cổng 80 và 443 làm lựa chọn thay thế cho các kết nối đến".

Và như đã chỉ ra bên dưới, hãy thực hiện thiết lập lại IIS sau khi hoàn tất.


2
và nhớ khởi động lại IIS sau khi làm như vậy
Ahmed Galal

3

Tôi đã cố gắng truy cập API Last.fm Rest từ phía sau một proxy và gặp lỗi nổi tiếng này.

Máy chủ đã vi phạm giao thức. Section = ResponseStatusLine

Sau khi thử một số cách giải quyết, chỉ có hai cách này phù hợp với tôi

HttpWebRequest HttpRequestObj = WebRequest.Create(BaseUrl) as HttpWebRequest;
HttpRequestObj.ProtocolVersion = HttpVersion.Version10;

HttpWebRequest HttpRequestObj = WebRequest.Create(BaseUrl) as HttpWebRequest;
HttpRequestObj.ServicePoint.Expect100Continue = false;

2

Không có giải pháp nào phù hợp với tôi, vì vậy tôi phải sử dụng WebClient thay vì HttpWebRequest và vấn đề không còn nữa.

Tôi cần sử dụng CookieContainer, vì vậy tôi đã sử dụng giải pháp được đăng bởi Pavel Savara trong chủ đề này - Sử dụng CookieContainer với lớp WebClient

chỉ cần xóa "protected" khỏi dòng này:

private readonly CookieContainer container = new CookieContainer ();


2

Nguyên nhân có thể gây ra sự cố này là do cấu hình Giao thức khám phá tự động proxy web (WPAD) trên mạng. Yêu cầu HTTP sẽ được gửi một cách minh bạch tới một proxy có thể gửi lại phản hồi mà máy khách sẽ không chấp nhận hoặc không được định cấu hình để chấp nhận. Trước khi hack mã của bạn thành từng bit, hãy kiểm tra xem WPAD có đang hoạt động hay không, đặc biệt nếu điều này chỉ mới "bắt đầu xảy ra".


2

Vấn đề của tôi là tôi đã gọi httpsđiểm cuối với http.


1

Điều đầu tiên chúng tôi đã thử là vô hiệu hóa tính năng nén nội dung động cho IIS, điều này đã giải quyết được lỗi nhưng lỗi không phải do phía máy chủ và chỉ một ứng dụng khách bị ảnh hưởng bởi điều này.

Về phía máy khách, chúng tôi đã gỡ cài đặt máy khách VPN, đặt lại cài đặt internet và sau đó cài đặt lại máy khách VPN. Lỗi cũng có thể do phần mềm chống vi-rút trước đó có tường lửa gây ra. Sau đó, chúng tôi đã bật tính năng nén nội dung động trở lại và bây giờ nó hoạt động tốt như trước.

Đã xuất hiện lỗi trong ứng dụng tùy chỉnh kết nối với dịch vụ web và cả ở TFS.


0

Trong trường hợp của tôi, IIS không có quyền cần thiết để truy cập đường dẫn ASPX có liên quan.

Tôi đã cấp quyền cho người dùng IIS đối với thư mục liên quan và tất cả đều ổn.


0

Xem mã của bạn và tìm nếu bạn đang đặt một số tiêu đề với giá trị NULL hoặc trống.


0

Tôi bắt đầu gặp lỗi này từ các dịch vụ php JSON / REST của mình

Tôi bắt đầu gặp lỗi từ các lần tải lên POST hiếm gặp của relativley sau khi tôi thêm vào ob_start("ob_gzhandler")tập lệnh php GET được truy cập thường xuyên nhất

Tôi có thể sử dụng chỉ ob_start(), và mọi thứ đều ổn.

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.