Формат запиту не розпізнається для 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

Це вирішило мою проблему. Я отримував таку ж помилку, що і ОП; на тому, що раніше працював на сайті. Виявляється, хтось включив .NET 3.5 через функції Windows (з незв’язаних причин), які зламали мій сайт. aspnet_regiis -iвиправили це, хоча.
Нейт

16

Переконайтеся, що ви використовуєте правильний метод: Опублікувати / Отримати, правильний тип вмісту та правильні параметри (дані).

$.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

Прекрасно.

Випадок 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 ви повинні укласти виклик у формі aa з GET з чимось подібним

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

Ви також можете скористатися символом 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 (справжній) на початку мого виклику веб-служби та $ .holdReady (помилковий) після його закінчення. Це 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.