รูปแบบคำขอไม่ได้รับการยอมรับสำหรับ URL ที่ลงท้ายโดยไม่คาดหมาย


283

นี่ไม่ใช่คำถาม - โพสต์ไว้ที่นี่เพื่อการอ้างอิง:

เมื่อใช้บริการเว็บฉันได้รับข้อผิดพลาดดังต่อไปนี้:

รูปแบบคำขอไม่รู้จักสำหรับ URL ที่ลงท้ายด้วย/ myMethodName โดยไม่คาดหมาย


4
เพื่อให้ง่ายขึ้นสำหรับ Google การแปลข้อความแสดงข้อผิดพลาดในภาษาเยอรมันจะอ่านว่า " Unbekanntes Anforderungsformat สำหรับ URL eine ให้ตาย unerwartet mit '/ _myMethodName' endet "
Uwe Keim

และการแปลภาษาจีน: " 無法辨認要求格式, 因為 URL 未預期地以 / myMethodName 結束。 "
Ignatius

คำตอบ:


515

พบทางออกในเว็บไซต์นี้

สิ่งที่คุณต้องมีก็คือการเพิ่มสิ่งต่อไปนี้ลงในเว็บของคุณ

<configuration>
  <system.web>
    <webServices>
      <protocols>
        <add name="HttpGet"/>
        <add name="HttpPost"/>
      </protocols>
    </webServices>
  </system.web>
</configuration>

ข้อมูลเพิ่มเติมจากMicrosoft


3
ฉันคิดว่าสิ่งที่คุณต้องทำคือเปลี่ยน <system.web> เป็น <system.webserver>
โรมัน m

ฉันเก็บมันไว้ตามที่เป็นอยู่และตอนนี้ข้อผิดพลาดดูเหมือนจะหายไป หากฉันเห็นข้อผิดพลาดอีกครั้งฉันจะย้ายการกำหนดค่าเว็บเซอร์ไปยังส่วนเว็บเซิร์ฟเวอร์
Daniel Brink

1
และถ้าข้อผิดพลาดนี้ถูกโยนโดยไม่มีความสม่ำเสมอใด ๆ เพียงบางครั้ง? การโทรดังกล่าวขึ้นอยู่กับการกำหนดค่าไคลเอนต์ / เบราว์เซอร์!
Vladislav

2
บน Win2012srv ด้วย IIS8 มันต้องการ บน Win8 ด้วย IIS8 ไม่จำเป็น ไม่มีความแตกต่างอื่น ๆ ในการกำหนดค่าที่ฉันรู้
LosManos

1
@SaurabhRai ฉันด้วย สิ่งนี้ทำอะไร ลิงก์ที่ให้ไว้ในคำตอบนั้นใช้งานไม่ได้
ร็อด

18

แม้จะมี 90% ของข้อมูลทั้งหมดที่ฉันพบ (ในขณะที่พยายามหาทางแก้ไขข้อผิดพลาดนี้) บอกให้ฉันเพิ่มHttpGetและHttpPostการกำหนดค่าที่ไม่ได้ผลสำหรับฉัน ... และไม่สมเหตุสมผลกับฉันเลย

แอปพลิเคชันของฉันทำงานบนเซิร์ฟเวอร์จำนวนมาก (30+) และฉันไม่เคยต้องเพิ่มการกำหนดค่าสำหรับพวกเขาใด ๆ เวอร์ชันของแอปพลิเคชันที่ทำงานภายใต้. NET 2.0 หรือ. NET 4.0

ทางออกสำหรับฉันคือการลงทะเบียน ASP.NET กับ IIS อีกครั้ง

ฉันใช้บรรทัดคำสั่งต่อไปนี้เพื่อให้บรรลุ ...

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i

นี่เป็นการแก้ไขปัญหาของฉัน ฉันได้รับข้อผิดพลาดเดียวกับ OP; ในสิ่งที่เคยเป็นไซต์ที่ทำงานก่อนหน้านี้ กลายเป็นคนที่เปิดใช้งาน. NET 3.5 ผ่านคุณสมบัติของ windows (สำหรับเหตุผลที่ไม่เกี่ยวข้อง) ซึ่งทำให้ไซต์ของฉันพังaspnet_regiis -iแก้ไขมันแม้ว่า
เนท

16

ตรวจสอบให้แน่ใจว่าคุณใช้วิธีการที่ถูกต้อง: โพสต์ / รับประเภทเนื้อหาที่ถูกต้องและพารามิเตอร์ที่ถูกต้อง (ข้อมูล)

$.ajax({
    type: "POST",
    url: "/ajax.asmx/GetNews",
    data: "{Lang:'tr'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (msg) { generateNews(msg); }
})

1
ค่าพารามิเตอร์ที่ส่งผ่านของฉันมีปัญหาเนื่องจากประเภทข้อมูลและค่าที่หายไปซึ่งมีข้อผิดพลาด 500 ครั้ง ตอนนี้มันได้รับการแก้ไข
Pranesh Janarthanan

เพิ่มcontent-type: application/jsonแก้ไขปัญหานี้ให้ฉันด้วย
Delphi.Boy

10

ดีเยี่ยม

กรณีที่ 2 - ซึ่งปัญหาเดียวกันสามารถจัด) ในกรณีของฉันปัญหาเกิดจากบรรทัดต่อไปนี้:

<webServices>
  <protocols>
    <remove name="Documentation"/>
  </protocols>
</webServices>

มันทำงานได้ดีในเซิร์ฟเวอร์เนื่องจากมีการโทรโดยตรงไปยังฟังก์ชันเว็บเซอร์ - แต่จะล้มเหลวหากคุณเรียกใช้บริการโดยตรงจาก. Net ในสภาพแวดล้อมการดีบักและต้องการทดสอบการใช้งานฟังก์ชั่นด้วยตนเอง


เพิ่มตรรกะนั้นลงใน web.config เพื่อป้องกันไม่ให้คำนิยามแสดงเมื่อเรียกดูบริการ. asmx เห็นได้ชัดว่าทำลาย ActiveReports ดีใจที่รู้ว่ามันเป็นอาการของการทดสอบในพื้นที่และจะทำงานบนเซิร์ฟเวอร์ ขอบคุณ
จาค็อบบาร์นส์

2

สำหรับบันทึกฉันได้รับข้อผิดพลาดนี้เมื่อฉันย้ายแอปเก่าจากเซิร์ฟเวอร์หนึ่งไปยังอีกเซิร์ฟเวอร์หนึ่ง ฉันเพิ่ม<add name="HttpGet"/> <add name="HttpPost"/>องค์ประกอบลงใน web.config ซึ่งเปลี่ยนข้อผิดพลาดเป็น:

System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at BitMeter2.DataBuffer.incrementCurrent(Int64 val)
   at BitMeter2.DataBuffer.WindOn(Int64 count, Int64 amount)
   at BitMeter2.DataHistory.windOnBuffer(DataBuffer buffer, Int64 totalAmount, Int32 increments)
   at BitMeter2.DataHistory.NewData(Int64 downloadValue, Int64 uploadValue)
   at BitMeter2.frmMain.tickProcessing(Boolean fromTimerEvent)

เพื่อแก้ไขข้อผิดพลาดนี้ฉันต้องเพิ่มบรรทัด ScriptHandlerFactory ใน web.config:

  <system.webServer>
    <handlers>
      <remove name="ScriptHandlerFactory" />
      <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    </handlers>
  </system.webServer>

ทำไมมันทำงานโดยไม่มีบรรทัดเหล่านี้บนเว็บเซิร์ฟเวอร์หนึ่งและไม่ใช่อีกอันที่ฉันไม่รู้


1

ฉันใช้โค้ดบรรทัดต่อไปนี้เพื่อแก้ไขปัญหานี้ เขียนรหัสต่อไปนี้ในไฟล์ web.config

<configuration>
    <system.web.extensions>
       <scripting>
       <webServices>
       <jsonSerialization maxJsonLength="50000000"/>
      </webServices>
     </scripting>
   </system.web.extensions>
</configuration>

1

ฉันไม่มีปัญหาเมื่อพัฒนาเป็น localhost อย่างไรก็ตามเมื่อฉันเผยแพร่ไปยังเว็บเซิร์ฟเวอร์ webservice ส่งคืนผลลัพธ์ว่างเปล่า (ว่าง) และฉันเห็นข้อผิดพลาดในบันทึกของฉัน

ฉันแก้ไขโดยตั้งค่า ajax contentType เป็น:

"application/json; charset=utf-8"

และการใช้:

JSON.stringify()

บนวัตถุที่ฉันกำลังโพสต์

var postData = {data: myData};
$.ajax({
                type: "POST",
                url: "../MyService.asmx/MyMethod",
                data: JSON.stringify(postData), 
                contentType: "application/json; charset=utf-8",
                success: function (data) {
                    console.log(data);
                },
                dataType: "json"
            });

1

ฉันยังได้รับข้อผิดพลาดนี้ด้วย apache mod-mono ดูเหมือนว่าหน้าเอกสารสำหรับ webservice ยังไม่ได้ใช้งานใน linux แต่เว็บเซอร์ทำงานได้แม้จะมีข้อผิดพลาดนี้ คุณควรดูโดยเพิ่ม?WSDLที่ส่วนท้ายของ URL เช่นhttp: //localhost/WebService1.asmx? WSDL


1

ในกรณีของฉันเกิดข้อผิดพลาดเมื่อฉันย้ายจากพีซีในพื้นที่ Windows 10 ไปยังเซิร์ฟเวอร์เฉพาะที่มี Windows 2012 วิธีแก้ปัญหาสำหรับเพิ่ม web.config ในบรรทัดต่อไปนี้

<webServices>
        <protocols>
               <add name="Documentation"/>
        </protocols>
</webServices>

0

ใน html คุณต้องปิดการโทรในรูปแบบ aa ด้วย GET พร้อมกับสิ่งที่ชอบ

<a href="/service/servicename.asmx/FunctionName/parameter=SomeValue">label</a>

คุณยังสามารถใช้ POSTกับการกระทำที่เป็นที่ตั้งของบริการเว็บและป้อนพารามิเตอร์ผ่านแท็กอินพุต

นอกจากนี้ยังมีSOAPและเรียนพร็อกซี่


0

ในกรณีของฉันฉันมีโอเวอร์โหลดของฟังก์ชั่นที่ทำให้เกิดข้อยกเว้นนี้เมื่อฉันเปลี่ยนชื่อของฟังก์ชั่นที่สองของฉันมันก็โอเคโอเคเดาว่าเว็บเซิร์ฟเวอร์ไม่รองรับฟังก์ชั่นการโอเวอร์โหลด


0

ในกรณีของเราปัญหาเกิดจากการบริการเว็บที่เรียกว่าใช้วิธีการร้องขอ OPTIONS (แทน GET หรือ POST)

เรายังไม่รู้ว่าเหตุใดปัญหาจึงปรากฏขึ้นโดยฉับพลัน บริการเว็บดำเนินงานมา 5 ปีแล้วบน HTTP และ HTTPS เราเป็นคนเดียวที่ใช้บริการเว็บและใช้ POST เสมอ

เมื่อเร็ว ๆ นี้เราตัดสินใจที่จะสร้างเว็บไซต์ที่โฮสต์ SSL เว็บเซอร์วิสเท่านั้น เราได้เพิ่มกฎการเขียนซ้ำลงใน Web.config เพื่อแปลง HTTP ใด ๆ ให้เป็น HTTPS ปรับใช้และเริ่มรับทันทีบนคำขอ GET และ POST ปกติคำขอ OPTIONS คำขอ OPTIONS ทำให้เกิดข้อผิดพลาดที่กล่าวถึงในโพสต์นี้

แอปพลิเคชั่นที่เหลือทำงานได้อย่างสมบูรณ์แบบ แต่เรายังคงได้รับรายงานข้อผิดพลาดนับร้อยเนื่องจากปัญหานี้

มีหลายโพสต์ (เช่นนี้ ) พูดคุยเกี่ยวกับวิธีการจัดการวิธีการตัวเลือก เราไปเพื่อจัดการคำขอ OPTIONS โดยตรงใน Global.asax ทำให้ปัญหาหายไป

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var req = HttpContext.Current.Request;
        var resp = HttpContext.Current.Response;

        if (req.HttpMethod == "OPTIONS")
        {
            //These headers are handling the "pre-flight" OPTIONS call sent by the browser
            resp.AddHeader("Access-Control-Allow-Methods", "GET, POST");
            resp.AddHeader("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, SOAPAction");
            resp.AddHeader("Access-Control-Max-Age", "1728000");
            resp.End();
        }
    }

0

ฉันได้รับข้อผิดพลาดนี้จนกว่าฉันจะเพิ่ม (ดังที่แสดงในรหัสด้านล่าง) $ .holdReady (จริง)ที่จุดเริ่มต้นของการเรียกบริการเว็บของฉันและ$ .holdReady (false)หลังจากสิ้นสุด นี่คือสิ่ง jQuery ที่จะระงับสถานะพร้อมของหน้าเพื่อให้สคริปต์ใด ๆ ภายใน document.ready function จะรอให้สิ่งนี้ (ในหมู่อื่น ๆ ที่เป็นไปได้ แต่สิ่งที่ฉันไม่รู้จัก)

<span class="AjaxPlaceHolder"></span>
<script type="text/javascript">
$.holdReady(true);
function GetHTML(source, section){
    var divToBeWorkedOn = ".AjaxPlaceHolder";
    var webMethod = "../MyService.asmx/MyMethod";
    var parameters = "{'source':'" + source + "','section':'" + section + "'}";

    $.ajax({
        type: "POST",
        url: webMethod,
        data: parameters,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: true,
        xhrFields: {
            withCredentials: false
        },
        crossDomain: true,
        success: function(data) {
            $.holdReady(false);
            var myData = data.d;
            if (myData != null) {
                $(divToBeWorkedOn).prepend(myData.html);
            }
        },
        error: function(e){
            $.holdReady(false);
            $(divToBeWorkedOn).html("Unavailable");
        }
    });
}
GetHTML("external", "Staff Directory");
</script>

-1

ตรวจสอบให้แน่ใจว่าคุณปิดใช้งานข้อผิดพลาดที่กำหนดเอง สิ่งนี้สามารถปกปิดปัญหาดั้งเดิมในรหัสของคุณ:

เปลี่ยนแปลง

<customErrors defaultRedirect="~/Error" mode="On">

ถึง

<customErrors defaultRedirect="~/Error" mode="Off">

-1

WebMethod ที่ต้องใช้ ContextKey

[WebMethod]
public string[] GetValues(string prefixText, int count, string contextKey)

เมื่อไม่ได้ตั้งค่าคีย์นี้ได้รับการยกเว้น

แก้ไขได้โดยกำหนดคีย์ของ AutoCompleteExtender

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