これは質問ではありません-参照用にここに投稿してください:
WebServiceを使用すると、次のエラーが発生しました。
/ myMethodNameで予期せず終了するURLのリクエスト形式が認識されない
これは質問ではありません-参照用にここに投稿してください:
WebServiceを使用すると、次のエラーが発生しました。
/ myMethodNameで予期せず終了するURLのリクエスト形式が認識されない
回答:
このウェブサイトで解決策を見つけた
必要なのは、web.configに以下を追加することだけです。
<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で実行されているアプリケーションのバージョン。
私にとっての解決策は、IISに対してASP.NETを再登録することでした。
これを達成するために次のコマンドラインを使用しました...
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i
aspnet_regiis -i
それを修正しました。
適切な方法を使用していることを確認してください:Post / Get、適切なコンテンツタイプ、適切なパラメーター(データ)。
$.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>
呼び出しがwebservice関数に対して直接行われるため、サーバーで適切に機能しますが、デバッグ環境で.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)
このエラーを修正するために、web.configにScriptHandlerFactory行を追加する必要がありました。
<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サーバーでこれらの行なしに機能し、他のWebサーバーでは機能しないのかはわかりません。
この問題を修正するには、次のコード行を使用します。次のコードをweb.configファイルに記述します
<configuration>
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="50000000"/>
</webServices>
</scripting>
</system.web.extensions>
</configuration>
localhostで開発する場合、問題はありませんでした。ただし、Webサーバーに公開すると、Webサービスは空(空白)の結果を返し、ログにエラーが表示されました。
私の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でこのエラーが発生しました。Linuxにはまだwebserviceのドキュメントページが実装されていないようです。しかし、このエラーにもかかわらずWebサービスは機能しています。?WSDL
URLの最後に追加することで表示されます。つまり、http://localhost/WebService1.asmx?WSDL
私の場合、ローカルPC Windows 10からWindows 2012の専用サーバーに移動するとエラーが発生しました。解決策は、web.configに次の行を追加することでした。
<webServices>
<protocols>
<add name="Documentation"/>
</protocols>
</webServices>
私の場合、この例外を引き起こしている関数のオーバーロードがありましたが、2番目の関数の名前を変更すると、正常に実行されました。Webサーバーが関数のオーバーロードをサポートしていないと思います
私たちの場合、問題は、(GETまたはPOSTではなく)OPTIONSリクエストメソッドを使用して呼び出されたWebサービスが原因でした。
問題が突然現れた理由はまだわかりません。Webサービスは、HTTPとHTTPSの両方で5年間完全に動作していました。Webサービスを使用するのは私たちだけで、常にPOSTを使用しています。
最近、WebサービスをSSLのみでホストするサイトを作成することを決定しました。すべてのHTTPをHTTPSに変換するためにWeb.configに書き換えルールを追加し、展開すると、通常のGETおよびPOSTリクエストに加えて、OPTIONSリクエストがすぐに開始されました。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();
}
}
(以下のコードに示すように)Webサービス呼び出しの最初に$ .holdReady(true)を追加し、終了後に$ .holdReady(false)を追加するまで、このエラーが発生していました。これは、ページの準備完了状態を一時停止するjQueryのものであるため、document.ready関数内のすべてのスクリプトがこれを待機します(他の可能性はあるものの、私には不明です)。
<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>