นี่ไม่ใช่คำถาม - โพสต์ไว้ที่นี่เพื่อการอ้างอิง:
เมื่อใช้บริการเว็บฉันได้รับข้อผิดพลาดดังต่อไปนี้:
รูปแบบคำขอไม่รู้จักสำหรับ URL ที่ลงท้ายด้วย/ myMethodName โดยไม่คาดหมาย
นี่ไม่ใช่คำถาม - โพสต์ไว้ที่นี่เพื่อการอ้างอิง:
เมื่อใช้บริการเว็บฉันได้รับข้อผิดพลาดดังต่อไปนี้:
รูปแบบคำขอไม่รู้จักสำหรับ URL ที่ลงท้ายด้วย/ myMethodName โดยไม่คาดหมาย
คำตอบ:
พบทางออกในเว็บไซต์นี้
สิ่งที่คุณต้องมีก็คือการเพิ่มสิ่งต่อไปนี้ลงในเว็บของคุณ
<configuration>
<system.web>
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
</system.web>
</configuration>
ข้อมูลเพิ่มเติมจากMicrosoft
แม้จะมี 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
aspnet_regiis -i
แก้ไขมันแม้ว่า
ตรวจสอบให้แน่ใจว่าคุณใช้วิธีการที่ถูกต้อง: โพสต์ / รับประเภทเนื้อหาที่ถูกต้องและพารามิเตอร์ที่ถูกต้อง (ข้อมูล)
$.ajax({
type: "POST",
url: "/ajax.asmx/GetNews",
data: "{Lang:'tr'}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) { generateNews(msg); }
})
content-type: application/json
แก้ไขปัญหานี้ให้ฉันด้วย
ดีเยี่ยม
กรณีที่ 2 - ซึ่งปัญหาเดียวกันสามารถจัด) ในกรณีของฉันปัญหาเกิดจากบรรทัดต่อไปนี้:
<webServices>
<protocols>
<remove name="Documentation"/>
</protocols>
</webServices>
มันทำงานได้ดีในเซิร์ฟเวอร์เนื่องจากมีการโทรโดยตรงไปยังฟังก์ชันเว็บเซอร์ - แต่จะล้มเหลวหากคุณเรียกใช้บริการโดยตรงจาก. Net ในสภาพแวดล้อมการดีบักและต้องการทดสอบการใช้งานฟังก์ชั่นด้วยตนเอง
สำหรับบันทึกฉันได้รับข้อผิดพลาดนี้เมื่อฉันย้ายแอปเก่าจากเซิร์ฟเวอร์หนึ่งไปยังอีกเซิร์ฟเวอร์หนึ่ง ฉันเพิ่ม<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>
ทำไมมันทำงานโดยไม่มีบรรทัดเหล่านี้บนเว็บเซิร์ฟเวอร์หนึ่งและไม่ใช่อีกอันที่ฉันไม่รู้
ฉันใช้โค้ดบรรทัดต่อไปนี้เพื่อแก้ไขปัญหานี้ เขียนรหัสต่อไปนี้ในไฟล์ web.config
<configuration>
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="50000000"/>
</webServices>
</scripting>
</system.web.extensions>
</configuration>
ฉันไม่มีปัญหาเมื่อพัฒนาเป็น 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"
});
ฉันยังได้รับข้อผิดพลาดนี้ด้วย apache mod-mono ดูเหมือนว่าหน้าเอกสารสำหรับ webservice ยังไม่ได้ใช้งานใน linux แต่เว็บเซอร์ทำงานได้แม้จะมีข้อผิดพลาดนี้ คุณควรดูโดยเพิ่ม?WSDL
ที่ส่วนท้ายของ URL เช่นhttp: //localhost/WebService1.asmx? WSDL
ในกรณีของฉันเกิดข้อผิดพลาดเมื่อฉันย้ายจากพีซีในพื้นที่ Windows 10 ไปยังเซิร์ฟเวอร์เฉพาะที่มี Windows 2012 วิธีแก้ปัญหาสำหรับเพิ่ม web.config ในบรรทัดต่อไปนี้
<webServices>
<protocols>
<add name="Documentation"/>
</protocols>
</webServices>
ใน html คุณต้องปิดการโทรในรูปแบบ aa ด้วย GET พร้อมกับสิ่งที่ชอบ
<a href="/service/servicename.asmx/FunctionName/parameter=SomeValue">label</a>
คุณยังสามารถใช้ POST
กับการกระทำที่เป็นที่ตั้งของบริการเว็บและป้อนพารามิเตอร์ผ่านแท็กอินพุต
นอกจากนี้ยังมีSOAP
และเรียนพร็อกซี่
ในกรณีของฉันฉันมีโอเวอร์โหลดของฟังก์ชั่นที่ทำให้เกิดข้อยกเว้นนี้เมื่อฉันเปลี่ยนชื่อของฟังก์ชั่นที่สองของฉันมันก็โอเคโอเคเดาว่าเว็บเซิร์ฟเวอร์ไม่รองรับฟังก์ชั่นการโอเวอร์โหลด
ในกรณีของเราปัญหาเกิดจากการบริการเว็บที่เรียกว่าใช้วิธีการร้องขอ 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();
}
}
ฉันได้รับข้อผิดพลาดนี้จนกว่าฉันจะเพิ่ม (ดังที่แสดงในรหัสด้านล่าง) $ .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>
ตรวจสอบให้แน่ใจว่าคุณปิดใช้งานข้อผิดพลาดที่กำหนดเอง สิ่งนี้สามารถปกปิดปัญหาดั้งเดิมในรหัสของคุณ:
เปลี่ยนแปลง
<customErrors defaultRedirect="~/Error" mode="On">
ถึง
<customErrors defaultRedirect="~/Error" mode="Off">
WebMethod ที่ต้องใช้ ContextKey
[WebMethod]
public string[] GetValues(string prefixText, int count, string contextKey)
เมื่อไม่ได้ตั้งค่าคีย์นี้ได้รับการยกเว้น
แก้ไขได้โดยกำหนดคีย์ของ AutoCompleteExtender
ac.ContextKey = "myKey";