Формат запроса не распознан для URL, неожиданно заканчивающегося на - PullRequest
264 голосов
/ 18 марта 2009

Это не вопрос - разместите его здесь для справки:

При использовании WebService я получил следующую ошибку:

Формат запроса не распознается для URL, неожиданно заканчивающегося на / myMethodName

Ответы [ 15 ]

485 голосов
/ 18 марта 2009

Нашли решение на этом сайте

Все, что вам нужно, это добавить следующее в ваш web.config

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

Больше информации от Microsoft

17 голосов
/ 19 ноября 2013

Несмотря на то, что 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
15 голосов
/ 26 января 2011

Убедитесь, что вы используете правильный метод: 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); }
})
9 голосов
/ 05 февраля 2013

Superb.

Случай 2 - где может возникнуть та же проблема) в моем случае проблема была из-за следующей строки:

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

Он хорошо работает на сервере, поскольку вызовы выполняются непосредственно в функции веб-службы - однако произойдет сбой, если вы запустите службу напрямую из .Net в среде отладки и захотите протестировать запуск функции вручную.

2 голосов
/ 01 апреля 2014

Для записи я получил эту ошибку, когда я переместил старое приложение с одного сервера на другой. Я добавил <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 голос
/ 26 апреля 2016

Я использую следующую строку кода, чтобы решить эту проблему. Введите следующий код в файл web.config

<configuration>
    <system.web.extensions>
       <scripting>
       <webServices>
       <jsonSerialization maxJsonLength="50000000"/>
      </webServices>
     </scripting>
   </system.web.extensions>
</configuration>
0 голосов
/ 31 мая 2019

Я получал эту ошибку, пока не добавил (как показано в коде ниже) $. 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>
0 голосов
/ 31 июля 2018

В моем случае ошибка произошла, когда я перешел с локального ПК Windows 10 на выделенный сервер с Windows 2012. Решением было добавить в файл web.config следующие строки

<webServices>
        <protocols>
               <add name="Documentation"/>
        </protocols>
</webServices>
0 голосов
/ 13 апреля 2018

В нашем случае проблема была вызвана вызовом веб-сервиса с использованием метода запроса OPTIONS (вместо GET или POST).

Мы до сих пор не знаем, почему проблема возникла внезапно. Веб-сервис отлично работал в течение 5 лет как по HTTP, так и по HTTPS. Мы единственные, кто использует веб-сервис, и он всегда использует POST.

Недавно мы решили сделать сайт, на котором размещен только веб-сервис SSL. Мы добавили правила перезаписи в Web.config, чтобы преобразовать любой HTTP в HTTPS, развернули и сразу же начали получать, помимо обычных запросов 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 голосов
/ 19 декабря 2016

Я также получил эту ошибку с apache mod-mono. Похоже, что страница документации для веб-сервиса еще не реализована в Linux. Но веб-сервис работает, несмотря на эту ошибку. Вы должны увидеть это, добавив ?WSDL в конце URL, т.е. http://localhost/WebService1.asmx?WSDL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...