Bu bir soru değil - referans için buraya gönderme:
Bir Web Hizmeti kullanırken, aşağıdaki hatayı aldım:
/ MyMethodName ile beklenmedik şekilde biten URL için istek biçimi tanınmıyor
Bu bir soru değil - referans için buraya gönderme:
Bir Web Hizmeti kullanırken, aşağıdaki hatayı aldım:
/ MyMethodName ile beklenmedik şekilde biten URL için istek biçimi tanınmıyor
Yanıtlar:
Bu web sitesinde bir çözüm bulundu
İhtiyacınız olan tek şey aşağıdakileri web.config dosyasına eklemektir
<configuration>
<system.web>
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
</system.web>
</configuration>
Microsoft'tan daha fazla bilgi
Bulduğum tüm bilgilerin% 90'ına rağmen (bu hataya bir çözüm bulmaya çalışırken) bana HttpGet
ve HttpPost
yapılandırmaya eklememi söyledi, bu benim için işe yaramadı ... ve yine de bana mantıklı gelmedi.
Uygulamam çok sayıda sunucuda (30+) çalışıyor ve bu yapılandırmayı hiçbir zaman eklemek zorunda kalmadım. .NET 2.0 veya .NET 4.0 altında çalışan uygulamanın sürümü.
Benim için çözüm ASP.NET'i IIS'ye yeniden kaydetmekti.
Bunu başarmak için aşağıdaki komut satırını kullandım ...
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i
aspnet_regiis -i
olsa düzeltildi.
Doğru yöntemi kullandığınızdan emin olun: Gönder / Al, doğru içerik türü ve doğru parametreler (veriler).
$.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
de benim için bu sorunu çözdü.
Süper.
Durum 2 - aynı sorunun ortaya çıkabileceği yer) benim durumumda sorun şu satırdan kaynaklanıyordu:
<webServices>
<protocols>
<remove name="Documentation"/>
</protocols>
</webServices>
Çağrılar doğrudan web hizmeti işlevine yapıldığından sunucuda iyi çalışır - ancak hizmeti doğrudan hata ayıklama ortamında .Net'ten çalıştırırsanız ve işlevi manuel olarak çalıştırmayı test etmek isterseniz başarısız olur.
Kayıt için eski bir uygulamayı bir sunucudan diğerine taşıdığımda bu hatayı alıyordum. <add name="HttpGet"/> <add name="HttpPost"/>
Hatayı şu şekilde değiştiren öğeleri web.config dosyasına ekledim :
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)
Bu hatayı düzeltmek için web.config dosyasına ScriptHandlerFactory satırlarını eklemek zorunda kaldım:
<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>
Neden bu satırlar olmadan bir web sunucusunda çalıştı, diğerini bilmiyorum.
Bu sorunu gidermek için aşağıdaki kod satırını kullanın. Web.config dosyasına aşağıdaki kodu yazın
<configuration>
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="50000000"/>
</webServices>
</scripting>
</system.web.extensions>
</configuration>
Yerel ana bilgisayar geliştirirken sorun yaşamadım. Ancak, bir kez bir web sunucusunda yayınladı, webservice boş (boş) bir sonuç döndürüyordu ve günlüklerimde hata görüyordum.
Benim ajax contentType ayarlayarak düzeltildi:
"application/json; charset=utf-8"
ve kullanma:
JSON.stringify()
yayınladığım nesne üzerinde.
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"
});
Ayrıca apache mod-mono ile bu hatayı aldım. Web servisinin dokümantasyon sayfası linux'ta henüz uygulanmadı. Ancak bu hataya rağmen web hizmeti çalışıyor. URL'nin?WSDL
sonuna ekleyerek görmelisiniz , yani http: //localhost/WebService1.asmx? WSDL
Benim durumumda, yerel bilgisayarım Windows 10'dan Windows 2012 ile özel bir sunucuya taşındığımda hata oluştu. Bunun çözümü web'e eklemekti. Aşağıdaki satırları yapılandır
<webServices>
<protocols>
<add name="Documentation"/>
</protocols>
</webServices>
HTML'de çağrıyı aa formuna GET ile benzer bir şeyle
<a href="/service/servicename.asmx/FunctionName/parameter=SomeValue">label</a>
Ayrıca POST
eylemi web hizmetinin konumu olarak a ile kullanabilir ve parametreyi bir giriş etiketi aracılığıyla girebilirsiniz.
Ayrıca SOAP
ve proxy sınıfları da vardır.
Benim durumumda, bu İstisnaya neden olan fonksiyonun aşırı yüklenmesi vardı, ikinci fonksiyonumun adını değiştirdikten sonra tamam, sanırım web sunucusu fonksiyon aşırı yüklemesini desteklemiyor
Bizim durumumuzda sorun, OPTIONS istek yöntemi kullanılarak çağrılan web hizmetinden kaynaklandı (GET veya POST yerine).
Sorunun neden aniden ortaya çıktığını hala bilmiyoruz. Web hizmeti hem HTTP hem de HTTPS üzerinden 5 yıldır mükemmel bir şekilde çalışıyor. Biz web hizmetini tüketen sadece biziz ve her zaman POST kullanıyor.
Kısa bir süre önce yalnızca web hizmetini barındıran siteyi SSL yapmaya karar verdik. HTTP'yi HTTPS'ye dönüştürmek, dağıtmak ve hemen normal GET ve POST istekleri, OPTIONS istekleri üzerine almak için Web.config dosyasına yeniden yazma kuralları ekledik. OPTIONS istekleri bu yayında tartışılan hataya neden oldu.
Uygulamanın geri kalanı mükemmel çalıştı. Ancak bu sorun nedeniyle yüzlerce hata raporu almaya devam ettik.
SEÇENEKLER yönteminin nasıl ele alınacağını tartışan birkaç yazı (örneğin bu ) vardır. OPTIONS isteğini doğrudan Global.asax'ta ele almaya gittik. Bu problemi ortadan kaldırdı.
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();
}
}
(Aşağıdaki kodda gösterildiği gibi) ekledim kadar bu hatayı başlamıştı (doğru) $ .holdReady benim web hizmeti çağrısı ve başında $ .holdReady (yanlış) sona erdiğinde. Bu jQuery şey sayfanın hazır durumunu askıya böylece belge.ready fonksiyonu içindeki herhangi bir komut dosyası (diğer olası yanı sıra benim için bilinmeyen şeyler) bekliyor olacak.
<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>
Özel hataları devre dışı bıraktığınızdan emin olun. Bu, kodunuzdaki orijinal sorunu maskeleyebilir:
değişiklik
<customErrors defaultRedirect="~/Error" mode="On">
için
<customErrors defaultRedirect="~/Error" mode="Off">