เซิร์ฟเวอร์ละเมิดโปรโตคอล Section = ResponseStatusLine ERROR


116

ฉันได้สร้างโปรแกรมพยายามโพสต์สตริงบนไซต์และฉันได้รับข้อผิดพลาดนี้:

"เซิร์ฟเวอร์ละเมิดโปรโตคอล Section = ResponseStatusLine"

หลังจากบรรทัดของรหัสนี้:

gResponse = (HttpWebResponse)gRequest.GetResponse(); 

ฉันจะแก้ไขข้อยกเว้นนี้ได้อย่างไร

คำตอบ:


71

ลองใส่สิ่งนี้ใน app / web.config ของคุณ:

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

หากไม่ได้ผลคุณอาจลองตั้งค่าKeepAliveคุณสมบัติเป็นเท็จ


3
ฉันมี 6 URL ที่แสดงข้อผิดพลาดนี้ การตั้งค่า useUnsafeHeaderParsing แก้ไขสำหรับลิงก์เดียว แต่การตั้งค่า KeepAlive = false แก้ไขสำหรับ 6 ทั้งหมด
David Hammond

3
สิ่งเดียวกันนี้สามารถวางไว้ในแท็กรูท <configuration> ที่ App.copnfig สำหรับแอปพลิเคชันที่ไม่ใช่เว็บ (ตัวอย่างเช่นฉันแก้ไขแอป WPF ด้วยวิธีนั้น - ขอบคุณ!)
Yury Schkatula

มีใครรู้บ้างว่าทำไม IIS ถึงกำหนดมาตรการความปลอดภัยนี้ มันใช้งานได้ แต่ฉันไม่เข้าใจเหตุผลของการ จำกัด ค่าส่วนหัว (ตั้งค่าด้วยตนเองในกรณีของฉัน)
emran

26
นี่เป็นเพียงการหลีกเลี่ยงปัญหาแทนที่จะแก้ไขจริงๆ ฉันคิดว่านี่ไม่ควรเป็นทางออกเริ่มต้น
Tobias

4
เห็นด้วยกับ Tobias - คุณกำลังหลีกเลี่ยงปัญหา ตอนนี้อาจเป็นไปได้ว่าปัญหาอยู่ในเซิร์ฟเวอร์ที่คุณไม่สามารถแก้ไขได้ดังนั้นการหลีกเลี่ยงอาจเป็นทางเลือกเดียวของคุณ ... แต่ถึงกระนั้นขอให้ชัดเจนเกี่ยวกับความแตกต่างระหว่างการหลีกเลี่ยงข้อผิดพลาดของโปรโตคอลและการแก้ไขจริง
metaforge

58

บางครั้งข้อผิดพลาดนี้เกิดขึ้นเมื่อUserAgentพารามิเตอร์คำขอว่างเปล่า (ใน github.com api ในกรณีของฉัน)

การตั้งค่าพารามิเตอร์นี้เป็นสตริงที่กำหนดเองไม่ว่างช่วยแก้ปัญหาของฉันได้


5
นี่คือสิ่งที่ฉันต้องการ ขอบคุณ นี่คือตัวอย่างUser
David Ruhmann

บรรทัดด่วนที่จะใช้กับWebClientที่นี่stackoverflow.com/a/11841680/4795214

5
ขอบคุณ หากคุณต้องการสอบถามGitHubผ่านHttpClient add: client.DefaultRequestHeaders.Add("User-Agent", "Anything"); line เพื่อแก้ไข
Cihan Yakar

32

ผู้กระทำผิดในกรณีของฉันกำลังส่งคืนการNo Contentตอบสนอง แต่กำหนดเนื้อหาการตอบสนองในเวลาเดียวกัน คำตอบนี้อาจเตือนฉันและคนอื่น ๆไม่ให้NoContentตอบสนองด้วยร่างกายอีกต่อไป

พฤติกรรมนี้สอดคล้องกับ10.2.5 204 No Contentของข้อกำหนด HTTPซึ่งระบุว่า:

การตอบกลับ 204 ต้องไม่รวมข้อความ - เนื้อความดังนั้นจึงมักจะสิ้นสุดโดยบรรทัดแรกว่างหลังฟิลด์ส่วนหัว


เพียงอ่านสิ่งนี้หลังจากที่ฉันได้รับThe server committed a protocol violation. Section=ResponseStatusLine ข้อผิดพลาดเมื่อใช้ WebApi เพื่อส่งคืนการNoContent()ตอบกลับที่กำหนดเองซึ่งส่งNo Contentการตอบกลับด้วยเหตุผลที่แปลกประหลาด! เมื่อฉันเอาปัญหานั้นออกไป :)
Intrepid

2
นี่เป็นปัญหาของฉันเช่นกันแม้ว่าจะยุ่งยากเพราะเป็นการโทรหลังจากการตอบสนอง No Content ที่ล้มเหลว
mdickin

แก้ไขโดยลบออกsomeContentจากreturn Request.CreateResponse(HttpStatusCode.NoContent, someContent); +1
snippetkid

12

ความเป็นไปได้อื่น: เมื่อทำการ POST เซิร์ฟเวอร์จะตอบสนองด้วยการดำเนินการต่อ 100 ครั้งด้วยวิธีที่ไม่ถูกต้อง

สิ่งนี้ช่วยแก้ปัญหาให้ฉันได้:

request.ServicePoint.Expect100Continue = false;

สิ่งนี้ใช้ได้ผลสำหรับฉันเมื่อเข้าถึง MediaFire API
AlexPi

3
ฉันรู้ว่าฉันมาช้า แต่ "ในทางที่ไม่ถูกต้อง" หมายความว่าอย่างไร
kuskmen

1
สำหรับใครก็ตามที่ใช้HttpClientสิ่งต่อไปนี้ใช้ได้กับฉัน:var http = new HttpClient(); http.DefaultRequestHeaders.ExpectContinue = false;
user2444499

9

สิ่งนี้เกิดขึ้นกับฉันเมื่อฉันใช้ Skype บนเครื่องในพื้นที่ของฉัน ทันทีที่ฉันปิดข้อยกเว้นนั้นก็หายไป

ได้รับความอนุเคราะห์จากหน้านี้


มีปัญหาเดียวกัน กลายเป็น Skype โชคไม่ดีที่ไม่สามารถให้ข้อความที่เหมาะสมได้
jordan koskei

คุณไม่จำเป็นต้องปิด Skype จริงๆฉันได้เพิ่มคำตอบด้านล่างเพื่อแสดงวิธีจัดการโดยไม่ต้องปิด Skype
AltF4_

8

วิธีหนึ่งในการดีบักสิ่งนี้ (และเพื่อให้แน่ใจว่าเป็นการละเมิดโปรโตคอลที่ทำให้เกิดปัญหา) คือการใช้ Fiddler (Http Web Proxy) และดูว่าเกิดข้อผิดพลาดเดียวกันหรือไม่ หากไม่เป็นเช่นนั้น (เช่น Fiddler จัดการปัญหาให้คุณ) คุณควรจะสามารถแก้ไขได้โดยใช้แฟล็ก UseUnsafeHeaderParsing

หากคุณกำลังมองหาวิธีตั้งค่านี้โดยใช้โปรแกรมดูตัวอย่างได้ที่นี่: http://o2platform.wordpress.com/2010/10/20/dealing-with-the-server-committed-a-protocol-violation-sectionresponsestatusline /


Fiddler กำลังแก้ไขปัญหาที่ฉันมีกับคำขอ GET HTTP เราสามารถดูสิ่งที่ทำโดยมือไม่พาย?
Olivier MATROT

8

วิธีแก้ปัญหาจำนวนมากพูดถึงวิธีแก้ปัญหา แต่ไม่เกี่ยวกับสาเหตุที่แท้จริงของข้อผิดพลาด

สาเหตุหนึ่งที่เป็นไปได้ของข้อผิดพลาดนี้คือถ้าเว็บเซิร์ฟเวอร์ใช้การเข้ารหัสอื่นที่ไม่ใช่ASCIIหรือISO-8859-1เพื่อส่งออกส่วนการตอบสนองส่วนหัว เหตุผลในการใช้ISO-8859-1คือถ้าResponse-Phraseมีอักขระละตินแบบขยาย

สาเหตุที่เป็นไปได้อีกประการหนึ่งของข้อผิดพลาดนี้คือถ้าเว็บเซิร์ฟเวอร์ใช้UTF-8ที่ส่งออกไบต์ - ลำดับ - มาร์กเกอร์ (BOM) ตัวอย่างเช่นค่าคงที่เริ่มต้นจะEncoding.UTF8ส่งออก BOM และง่ายที่จะลืมสิ่งนี้ หน้าเว็บจะทำงานได้อย่างถูกต้องใน Firefox และ Chrome แต่HttpWebRequestจะระเบิด :) การแก้ไขอย่างรวดเร็วคือการเปลี่ยนเว็บเซิร์ฟเวอร์ให้ใช้การเข้ารหัส UTF-8 ที่ไม่ส่งออก BOM เช่นnew UTF8Encoding(false)(ซึ่งใช้ได้ตราบใดที่Response-Phraseมีอักขระ ASCII เพียงตัวเดียว แต่ควรใช้ASCIIหรือISO-8859-1สำหรับส่วนหัวแล้วUTF-8หรือ การเข้ารหัสอื่น ๆ สำหรับการตอบสนอง)


นี่คือการตอบสนองที่ดีที่สุด อธิบายว่าเหตุใดเว็บเซิร์ฟเวอร์จึงทำงานผิดปกติ ขอบคุณ! (ฉันต้องเลียนแบบเว็บเซิร์ฟเวอร์ที่มีซ็อกเก็ตเนื่องจากปัญหาการปรับใช้กับ HttpListener)
Andrew Rondeau

6

การตั้งค่าคาดว่า 100 ยังคงเป็นเท็จและการลดเวลาว่างของซ็อกเก็ตเป็นสองวินาทีช่วยแก้ปัญหาให้ฉันได้

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

6

Skype เป็นสาเหตุหลักของปัญหาของฉัน:

ข้อผิดพลาดนี้มักเกิดขึ้นเมื่อคุณได้ตั้งค่า Visual Studio เพื่อดีบักโปรแกรมประยุกต์บนเว็บที่มีอยู่ซึ่งทำงานใน IIS แทนที่จะเป็นเว็บเซิร์ฟเวอร์การดีบักASP.NET ในตัว โดยค่าเริ่มต้น IIS จะรับฟังคำขอทางเว็บบนพอร์ต 80 ในกรณีนี้แอปพลิเคชันอื่นกำลังรับฟังคำขอบนพอร์ต 80 อยู่แล้วโดยปกติแอปพลิเคชันที่กระทำผิดคือ Skype ซึ่งโดยค่าเริ่มต้นจะรับฟังบนพอร์ต 80 และ 443 เมื่อติดตั้ง Skype ครอบครองพอร์ต 80 อยู่แล้วดังนั้น IIS จึงไม่สามารถเริ่มทำงานได้

ในการแก้ไขปัญหาให้ทำตามขั้นตอน:

Skype -> เครื่องมือ -> ตัวเลือก -> ขั้นสูง -> การเชื่อมต่อ:

ยกเลิกการเลือก "ใช้พอร์ต 80 และ 443 เป็นทางเลือกสำหรับการเชื่อมต่อขาเข้า"

และตามที่ระบุไว้ด้านล่างทำการรีเซ็ต IISเมื่อเสร็จแล้ว


2
และอย่าลืมรีสตาร์ท IIS หลังจากทำเช่นนั้น
Ahmed Galal

3

ฉันพยายามเข้าถึง Last.fm Rest API จากหลังพร็อกซีและได้รับข้อผิดพลาดที่มีชื่อเสียงนี้

เซิร์ฟเวอร์ละเมิดโปรโตคอล มาตรา = ResponseStatusLine

หลังจากลองวิธีแก้ปัญหาแล้วมีเพียงสองคนนี้เท่านั้นที่ใช้ได้ผลสำหรับฉัน

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

และ

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

2

ไม่มีวิธีแก้ปัญหาใดที่ใช้ได้ผลสำหรับฉันดังนั้นฉันจึงต้องใช้ WebClient แทน HttpWebRequest และปัญหาก็ไม่มีอีกแล้ว

ฉันต้องการใช้ CookieContainer ดังนั้นฉันจึงใช้วิธีแก้ปัญหาที่โพสต์โดย Pavel Savara ในหัวข้อนี้ - การใช้ CookieContainer กับคลาส WebClient

เพียงแค่ลบ "ป้องกัน" ออกจากบรรทัดนี้:

ส่วนตัวอ่านอย่างเดียวคอนเทนเนอร์ CookieContainer = ใหม่ CookieContainer ();


2

สาเหตุที่เป็นไปได้ของปัญหานี้คือการกำหนดค่า Web Proxy Auto Discovery Protocol (WPAD) บนเครือข่าย คำขอ HTTP จะถูกส่งอย่างโปร่งใสไปยังพร็อกซีที่สามารถส่งการตอบกลับที่ไคลเอนต์ไม่ยอมรับหรือไม่ได้กำหนดค่าให้ยอมรับ ก่อนที่จะแฮ็กรหัสของคุณเป็นบิตตรวจสอบว่า WPAD ไม่ได้อยู่ในการเล่นโดยเฉพาะอย่างยิ่งหากสิ่งนี้เพิ่ง "เริ่มเกิดขึ้น" จากสีน้ำเงิน



1

สิ่งแรกที่เราพยายามคือปิดใช้งานการบีบอัดเนื้อหาแบบไดนามิกสำหรับ IIS ซึ่งแก้ไขข้อผิดพลาด แต่ข้อผิดพลาดไม่ได้เกิดจากฝั่งเซิร์ฟเวอร์และมีเพียงไคลเอนต์เดียวเท่านั้นที่ได้รับผลกระทบจากสิ่งนี้

ในฝั่งไคลเอนต์เราถอนการติดตั้งไคลเอนต์ VPN รีเซ็ตการตั้งค่าอินเทอร์เน็ตจากนั้นติดตั้งไคลเอนต์ VPN ใหม่ ข้อผิดพลาดอาจเกิดจากโปรแกรมป้องกันไวรัสรุ่นก่อนหน้าซึ่งมีไฟร์วอลล์ จากนั้นเราเปิดใช้งานการบีบอัดเนื้อหาแบบไดนามิกกลับและตอนนี้ก็ใช้งานได้ดีเหมือนเดิม

เกิดข้อผิดพลาดในแอปพลิเคชันที่กำหนดเองซึ่งเชื่อมต่อกับบริการบนเว็บและที่ TFS


0

ในกรณีของฉัน IIS ไม่มีสิทธิ์ที่จำเป็นในการเข้าถึงเส้นทาง ASPX ที่เกี่ยวข้อง

ฉันให้สิทธิ์ผู้ใช้ IIS แก่ไดเร็กทอรีที่เกี่ยวข้องและทุกอย่างก็เรียบร้อยดี



0

ฉันเริ่มได้รับข้อผิดพลาดนี้จากบริการ php JSON / REST ของฉัน

ฉันเริ่มได้รับข้อผิดพลาดจากการอัปโหลด POST ที่หายาก relativley หลังจากที่ฉันเพิ่มob_start("ob_gzhandler")ไปยังสคริปต์ GET php ที่เข้าถึงบ่อยที่สุด

ฉันสามารถใช้ได้ob_start()และทุกอย่างเรียบร้อยดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.