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

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

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

формат запроса не распознается для URL неожиданно заканчивается на / myMethodName

14 ответов


найдено решение на этот сайт

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

решение для меня было перерегистрироваться ASP.NET против IIS.

для этого я использовал следующую командную строку...

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -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); }
})

великолепно.

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

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

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


для записи я получал эту ошибку, когда я перемещал старое приложение с одного сервера на другой. Я добавил <add name="HttpGet"/> <add name="HttpPost"/> элементов в интернете.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>

почему он работал без этих строк на одном веб-сервере, а не другой я не знаю.


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

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

у меня не было проблемы при разработке в имя 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"
            });

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

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

вы также можете использовать POST С акции, расположение web-сервиса и входной параметр с помощью тега input.

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


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


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


в нашем случае проблема была вызвана вызовом веб-службы с помощью метода запроса опций (вместо GET или POST).

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

недавно мы решили сделать сайт, на котором размещается только веб-служба SSL. Мы добавили правила перезаписи в Сеть.config, чтобы преобразовать что-либо HTTP в HTTPS, развернул и сразу же начал получать, поверх обычных запросов GET и POST, запросы опций. Запросы параметров вызвали ошибку, описанную в этом сообщении.

остальная часть приложения работала отлично. Но мы продолжали получать сотни сообщений об ошибках из-за этой проблемы.

есть несколько сообщений (например,этот) обсуждение того, как обрабатывать метод OPTIONS. Мы пошли для обработки Параметры запроса непосредственно в глобальном.асакс. Это заставило проблему исчезнуть.

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

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

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

убедитесь, что вы отключить пользовательские ошибки. Это может замаскировать исходную проблему в вашем коде:

изменить

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

to

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

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

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

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

исправление путем назначения ключа AutoCompleteExtender.

ac.ContextKey = "myKey";