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


283

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

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

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


4
Чтобы упростить поиск в Google, перевод сообщения об ошибке на немецкий язык гласит: « Unbekanntes Anforderungsformat für eine URL, die unerwartet mit '/ _myMethodName' endet. ».
Уве Кейм

И китайский перевод: « 因為 辨認 要求 格式 , 因為 URL 未 預期 地 以 / myMethodName 結束。 »
Игнатий

Ответы:


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>
m

Я сохранил это как есть, и на данный момент ошибка, кажется, ушла. если я увижу ошибку снова, я перенесу конфиги веб-сервисов в раздел веб-сервера.
Даниэль Бринк

1
А что, если эта ошибка выдается без какой-либо регулярности, просто иногда? Зависят ли такие звонки от конфигурации клиента / браузера !?
Владислав

2
На Win2012srv с IIS8 это было необходимо. На Win8 с IIS8 это было не нужно. Других расхождений в конфигурации, о которых я знаю, нет.
LosManos

1
@SaurabhRai меня тоже. Что это сделало? Ссылки, приведенные в ответе, не работают.
Род

18

Несмотря на то, что 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

Это исправило мою проблему. Я получал ту же ошибку, что и OP; на ранее работавшем сайте. Оказывается, кто-то включил .NET 3.5 через функции Windows (по несвязанным причинам), которые сломали мой сайт. aspnet_regiis -iисправил это все же.
Нейт

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. сейчас это решено.
Пранеш Джанартанан

Добавить content-type: application/jsonрешил эту проблему и для меня тоже.
Delphi.Boy

10

Superb.

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

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

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


Добавил эту логику в web.config, чтобы предотвратить отображение определения при просмотре службы .asmx. Видимо, это сломало 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)

Чтобы исправить эту ошибку, мне нужно было добавить строки 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

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

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

1

У меня не было проблемы при разработке в localhost. Однако после публикации на веб-сервере веб-служба возвращала пустой (пустой) результат, и я увидела ошибку в своих журналах.

Я исправил это, установив свой 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. Но веб-сервис работает, несмотря на эту ошибку. Вы должны увидеть это, добавив ?WSDLв конце URL, то есть http: //localhost/WebService1.asmx? WSDL


1

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

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

0

В HTML вы должны заключить вызов в форме с GET с чем-то вроде

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

Вы также можете использовать POST с действием, определяющим местоположение веб-службы, и вводить параметр через тег ввода.

Есть также SOAPи прокси-классы.


0

В моем случае у меня была перегрузка функции, которая вызывала это исключение, как только я изменил имя моей второй функции, она работала нормально, думаю, веб-сервер не поддерживает перегрузку функции


0

В нашем случае проблема была вызвана вызовом веб-службы с использованием метода запроса 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

Я получал эту ошибку, пока не добавил (как показано в приведенном ниже коде) $ .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

WebMethod, который требует ContextKey,

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

когда этот ключ не установлен, получено исключение.

Исправить это, назначив ключ AutoCompleteExtender.

ac.ContextKey = "myKey";
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.