予期せず終了するURLのリクエスト形式が認識されません


283

これは質問ではありません-参照用にここに投稿してください:

WebServiceを使用すると、次のエラーが発生しました。

/ myMethodNameで予期せず終了するURLのリクエスト形式が認識されない


4
Googleを簡単にするために、エラーメッセージのドイツ語の翻訳は、「Unbekanntes Anforderungsformatfüreine URL、die unerwartet mit '/ _myMethodName' endet。」と書かれています
Uwe Keim 2017年

そして、中国語の翻訳:「無法解像度認要求格式、因為URL未預期地以/ myMethodName結束。
Ignatius

回答:


515

このウェブサイトで解決策を見つけた

必要なのは、web.configに以下を追加することだけです。

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

Microsoftからの詳細情報


3
<system.web>を<system.webserver>に切り替えるだけでいいと思います
roman m

私はそれをそのままにして、今のところエラーはなくなったようです。再びエラーが表示される場合は、webservices構成をwebserverセクションに移動します。
ダニエルブリンク

1
そして、このエラーが規則性なくスローされた場合はどうなりますか?そのような呼び出しは、一部のクライアント/ブラウザ構成に依存していますか?
ウラジスラフ

2
IIS8を備えたWin2012srvでは必要でした。IIS8を備えたWin8では必要ありませんでした。私が知っている構成に他の矛盾はありません。
LosManos 14年

1
@SaurabhRai私も。これは何をしましたか?回答で提供されているリンクは壊れています。
ロッド

18

私は(このエラーの解決策を見つけるためにしようとしているとき)を追加する私に言ったすべての情報の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

これで問題が解決しました。OPと同じエラーが発生しました。以前は機能していたサイトでした。私のサイトを壊した(無関係な理由で)Windowsの機能を介して誰かが.NET 3.5を有効にしたことが判明しました。aspnet_regiis -iそれを修正しました。
2015

16

適切な方法を使用していることを確認してください: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); }
})

1
私のパラメーター値の受け渡しは、データ型と欠損値のために問題を起こし、結果として500エラーになります。今では解決されています。
Pranesh Janarthanan

content-type: application/json私もこの問題を解決しました。
Delphi.Boy

10

見事。

ケース2-同じ問題が発生する可能性がある場合)私の場合、問題の原因は次のとおりです。

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

呼び出しがwebservice関数に対して直接行われるため、サーバーで適切に機能しますが、デバッグ環境で.Netから直接サービスを実行し、関数の手動実行をテストする場合は失敗します。


.asmxサービスを参照するときに定義が表示されないようにするために、そのロジックをweb.configに追加しました。どうやらそれは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)

このエラーを修正するために、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サーバーでは機能しないのかはわかりません。


1

この問題を修正するには、次のコード行を使用します。次のコードをweb.configファイルに記述します

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

1

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"
            });

1

また、apache mod-monoでこのエラーが発生しました。Linuxにはまだwebserviceのドキュメントページが実装されていないようです。しかし、このエラーにもかかわらずWebサービスは機能しています。?WSDLURLの最後に追加することで表示されます。つまり、http://localhost/WebService1.asmx?WSDL


1

私の場合、ローカルPC Windows 10からWindows 2012の専用サーバーに移動するとエラーが発生しました。解決策は、web.configに次の行を追加することでした。

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

0

HTMLでは、次のようなGETで呼び出しをaa形式で囲む必要があります

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

またPOST、アクションをWebサービスの場所として使用し、inputタグを介してパラメーターを入力することもできます。

SOAPプロキシクラスもあります。


0

私の場合、この例外を引き起こしている関数のオーバーロードがありましたが、2番目の関数の名前を変更すると、正常に実行されました。Webサーバーが関数のオーバーロードをサポートしていないと思います


0

私たちの場合、問題は、(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();
        }
    }

0

(以下のコードに示すように)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>

-1

カスタムエラーを無効にしてください。これにより、コードの元の問題を隠すことができます。

変化する

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

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

-1

ContextKeyを必要とするWebMethod

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

このキーが設定されていない場合、例外が発生しました。

AutoCompleteExtenderのキーを割り当てることで修正します。

ac.ContextKey = "myKey";
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.