Почему при использовании в Azure [duplicate] сбой при вызове веб-службы (.asmx)

Понимая, что это старый поток, но эта статья является одной из самых прямых, которые я нашел при сравнении чисел с плавающей запятой, и если вы хотите изучить больше, у нее есть более подробные ссылки, а также основной сайт охватывает полный диапазон вопросов, связанных с числами с плавающей запятой Руководство по плавающей запятой: сравнение .

В можно найти несколько более практическую статью Допуски с плавающей точкой revisited и отмечает, что существует тест абсолютного допуска , который сводится к этому в C ++:

bool absoluteToleranceCompare(double x, double y)
{
    return std::fabs(x - y) <= std::numeric_limits::epsilon() ;
}

и относительный допуск :

bool relativeToleranceCompare(double x, double y)
{
    double maxXY = std::max( std::fabs(x) , std::fabs(y) ) ;
    return std::fabs(x - y) <= std::numeric_limits::epsilon()*maxXY ;
}

В статье отмечается, что абсолютный тест терпит неудачу, когда x и y являются большими и терпят неудачу в относительном случае, когда они малы. Предполагая, что абсолютная и относительная толерантность одинакова, комбинированный тест будет выглядеть следующим образом:

bool combinedToleranceCompare(double x, double y)
{
    double maxXYOne = std::max( { 1.0, std::fabs(x) , std::fabs(y) } ) ;

    return std::fabs(x - y) <= std::numeric_limits::epsilon()*maxXYOne ;
}

249
задан roman m 18 March 2009 в 09:05
поделиться

14 ответов

Найден решение на этом веб-сайте

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

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

Дополнительная информация с Microsoft

459
ответ дан roman m 21 August 2018 в 06:25
поделиться
  • 1
    будет ли это работать и в приложениях IIS7 .Net2.0? – Daniel Brink 19 April 2010 в 13:48
  • 2
    i ДУМАЙТЕ все, что вам нужно сделать, это switch & lt; system.web & gt; к & lt; system.webserver & gt; – roman m 19 April 2010 в 19:56
  • 3
    я сохранил его как есть, и на данный момент ошибка, похоже, исчезла. если я снова увижу ошибку, я перейду configs веб-сервисов в раздел веб-сервера. – Daniel Brink 20 April 2010 в 09:08
  • 4
    А что, если эта ошибка будет выброшена без какой-либо регулярности, иногда? Являются ли такие вызовы зависимыми от конфигурации клиента / браузера !? – Vladislav 20 September 2013 в 12:46
  • 5
    На Win2012srv с IIS8 это было необходимо. На Win8 с IIS8 он не нужен. Никаких других расхождений в конфигурации, о которой я знаю. – LosManos 13 June 2014 в 13:57

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

0
ответ дан Amir Shrestha 21 August 2018 в 06:25
поделиться

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

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

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

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

Существует несколько сообщений (например, this ), в которых обсуждается, как обращаться с методом 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
ответ дан cockypup 21 August 2018 в 06:25
поделиться

Несмотря на 90% всей информации, которую я нашел (пытаясь найти решение этой ошибки), я сказал, чтобы добавить HttpGet и HttpPost в конфигурацию, которая не сработала для меня ... и didn Мне все равно.

Мое приложение работает на множестве серверов (30+), и мне никогда не приходилось добавлять эту конфигурацию для любого из них. Либо версия приложения, работающего под .NET 2.0, либо .NET 4.0.

Для меня было реорганизацией ASP.NET для IIS.

Я использовал следующую команду для достижения этой цели ...

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i
16
ответ дан Community 21 August 2018 в 06:25
поделиться
  • 1
    Спасибо, это действительно помогло. – Ondra Peterka 19 December 2013 в 12:46
  • 2
    Это исправило мою проблему. Я получал ту же ошибку, что и OP; на том, что было ранее работающим сайтом. Оказывается, кто-то включил .NET 3.5 через функции Windows (по независящим причинам), которые сломали мой сайт. aspnet_regiis -i исправил это. – Nate 15 July 2015 в 22:14

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

Я установил его, установив my 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
ответ дан Jason Williams 21 August 2018 в 06:25
поделиться

Превосходно

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

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

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

7
ответ дан Kalpesh Popat 21 August 2018 в 06:25
поделиться
  • 1
    – Ronen Festinger 9 January 2014 в 13:57
  • 2
    Добавлена ​​эта логика в web.config, чтобы предотвратить отображение определения при просмотре службы .asmx. По-видимому, это сломало ActiveReports. Рад узнать, что это, скорее всего, симптом тестирования на местном уровне, и он будет работать на сервере. Благодарю. – Jacob Barnes 21 August 2017 в 16:29
0
ответ дан l0pan 21 August 2018 в 06:25
поделиться

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

изменить

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

на

<customErrors defaultRedirect="~/Error" mode="Off">
-1
ответ дан Milan de Jong 21 August 2018 в 06:25
поделиться

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

<configuration>
    <system.web.extensions>
       <scripting>
       <webServices>
       <jsonSerialization maxJsonLength="50000000"/>
      </webServices>
     </scripting>
   </system.web.extensions>
</configuration>
1
ответ дан pankaj prajapati 21 August 2018 в 06:25
поделиться

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

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

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

Исправление, назначая ключ автозаполненияExtender.

ac.ContextKey = "myKey";
-1
ответ дан Rm558 21 August 2018 в 06:25
поделиться

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

<webServices>
        <protocols>
               <add name="Documentation"/>
        </protocols>
</webServices>
0
ответ дан Ruby Kousinovali 21 August 2018 в 06:25
поделиться

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

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

2
ответ дан Sprintstar 21 August 2018 в 06:25
поделиться

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

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

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

Существуют также SOAP и прокси-классы.

0
ответ дан Wilk 21 August 2018 в 06:25
поделиться

Убедитесь, что вы используете правильный метод: 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); }
})
13
ответ дан x-freestyler 21 August 2018 в 06:25
поделиться
  • 1
    моя передача значения параметра стала проблемой из-за типа данных и отсутствующих значений, которые заканчиваются ошибкой 500. теперь он решен. – Pranesh Janarthanan 16 February 2018 в 08:24
Другие вопросы по тегам:

Похожие вопросы: