2015-02-10 2 views
6

У меня есть сайт MVC, который работает локально просто отлично. Когда я отлаживаю приложение, конечно, оно работает под протоколом HTTP, тогда все работает нормально.StackOverflowException при отправке данных JSon на сервер (HTTP/HTTPS)

У меня есть контроллер:

[Route("messages/new/form/invoice"), HttpPost] 
public ActionResult Invoice(object model) 
{ 
    var result = JsonConvert.DeserializeObject<dynamic>(model.ToString()); 
    // Further processing goes here... 
} 

Примечание: Я удалил код из этого метода здесь, потому что это irrelivant.

Этот метод называется через службу HTTP-сообщений AngularJS $. Это делается следующим образом:

this.saveInvoice = function() { 
    // Post the form. 
    $http({ 
     method: "POST", 
     url: "/messages/new/form/invoice", 
     data: { model: JSON.stringify(this.invoice) }, 
     headers: { 'Content-Type': 'application/json' } 
    }).success(function (data) { 
     $('#content').html(data); 
    }).error(function (error) { 
     console.log('An error occured while saving the form: ' + error); 
    }); 
} 

Эта функция вызывается через мой взгляд:

<form id="invoiceForm" name="invoiceForm" ng-submit="invoiceForm.$valid && invoiceCtrl.saveInvoice();" novalidate ng-init="invoiceCtrl.Init(@Model.FlowId)"> 

Но, как сказано выше, при работе на локальном компьютере, код работает отлично.

Но теперь, я развернув его на сервер, где сайт работает по протоколу HTTPS на , что от курса отличается HTTP на моей локальной машине.

Когда я выполняю код, и я нажимаю кнопку, чтобы отправить форму на веб-сервере, откроется новое окно и это «Visual Studio Just In Time Debugger», попросив экземпляр Visual Studio отладить его , но Visual Studio не установлен на этом сервере, а это значит, что мне не нужно выбирать отладчик.

Это окно показано мне 3 раза. После отмены всех этих отладочные вопросов, в моем WebBrowser я вижу следующее в консоли:

An error occured while saving the form: <!DOCTYPE HTML PUBLIC "-//W3C//DTD  HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> 
<HTML><HEAD><TITLE>Service Unavailable</TITLE> 
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"> </HEAD> 
<BODY><h2>Service Unavailable</h2> 
<hr><p>HTTP Error 503. The service is unavailable.</p> 
</BODY></HTML> 

Это означает, что пул приложений разбилось.

Так что я попытался прямо сейчас следующее:

  • Развертывание отладочных на сервер.
  • В web.config сменил отладку компиляции на false.
  • Установлен удаленный отладчик Visual Studio и удаленная отладка приложения.

Когда я удаляю отладку приложения (что означает, что я привязываюсь к удаленному процессу IIS), я устанавливаю точку останова в первой строке метода в post post (см. Мой контроллер выше). Но этот метод не попал вообще, вместо этого удаленная отладка действительно бросает StackOverflowException, как только я нажимаю кнопку, чтобы отправить форму.

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

Редактировать: Добавлено web.конфиг

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging" /> 
    <sectionGroup name="elmah"> 
     <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" /> 
     <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" /> 
     <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" /> 
     <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" /> 
    </sectionGroup> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections> 
    <connectionStrings> 
    <!-- Removed for security reasons. --> 
    </connectionStrings> 
    <appSettings> 
    <add key="webpages:Version" value="3.0.0.0" /> 
    <add key="webpages:Enabled" value="false" /> 
    <add key="owin:AutomaticAppStartup" value="false" /> 
    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
    <add key="elmah.mvc.disableHandler" value="false" /> 
    <add key="elmah.mvc.disableHandleErrorFilter" value="true" /> 
    <add key="elmah.mvc.requiresAuthentication" value="false" /> 
    <add key="elmah.mvc.IgnoreDefaultRoute" value="false" /> 
    <add key="elmah.mvc.allowedRoles" value="*" /> 
    <add key="elmah.mvc.allowedUsers" value="*" /> 
    <add key="elmah.mvc.route" value="elmah" /> 

    </appSettings> 
    <location inheritInChildApplications="false"> 
    <system.web> 
     <globalization uiCulture="auto" culture="auto" /> 
     <authentication mode="Forms"> 
     <forms loginUrl="~/login" timeout="2880" /> 
     </authentication> 
     <pages> 
     <namespaces> 
      <add namespace="System.Web.Helpers" /> 
      <add namespace="System.Web.Mvc" /> 
      <add namespace="System.Web.Mvc.Ajax" /> 
      <add namespace="System.Web.Mvc.Html" /> 
      <add namespace="System.Web.Optimization" /> 
      <add namespace="System.Web.Routing" /> 
      <add namespace="System.Web.WebPages" /> 
      <add namespace="DocTrails3.Net.ViewModels" /> 
     </namespaces> 
     </pages> 
     <compilation debug="true" targetFramework="4.5.1" /> 
     <httpRuntime targetFramework="4.5.1" requestPathInvalidCharacters="&lt;,&gt;,%,&amp;,:,\,?" relaxedUrlToFileSystemMapping="true" maxRequestLength="1048576" /> 
     <httpModules> 
     <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" /> 
     <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" /> 
     <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" /> 
     </httpModules> 
    </system.web> 
    <system.webServer> 
     <validation validateIntegratedModeConfiguration="false" /> 
     <security> 
     <requestFiltering> 
      <requestLimits maxAllowedContentLength="1073741824" /> 
     </requestFiltering> 
     </security> 
     <httpProtocol> 
     <customHeaders> 
      <remove name="X-Powered-By" /> 
     </customHeaders> 
     <redirectHeaders> 

      <clear /> 
     </redirectHeaders> 
     </httpProtocol> 
     <modules> 
     <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" /> 
     <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" /> 
     <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" /> 
     </modules> 
    </system.webServer> 
    </location> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="0.0.0.0-5.1.0.0" newVersion="5.1.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Razor" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.WebPages.Deployment" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
    <!-- Entity Framework Configuration. --> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
    </entityFramework> 
    <elmah> 
    <security allowRemoteAccess="yes" /> 
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="elmah-sql" applicationName="DocTrails" /> 
    </elmah> 
</configuration>  

Edit: Добавлена ​​некоторая информация о входе

Благодаря комментариев на этот пост, я проверил в IIS, где журналы сохраняются.

На скриншоте ниже показано, где журналы сохраняются:

enter image description here

Согласно другому сообщению здесь на SO, я знаю, что журналы также могут быть найдены в следующих местах:

C:\Windows\System32\LogFiles\HTTPERR 

Итак, я выполнил новый запрос, и на сервере снова работает отладчик «Just-In-Time Debugger Windows» несколько раз (5, я думаю), но в обоих каталогах (тот, который указан на скриншоте , и один перечисленные выше) нет файлов, созданных или измененных с той же временной меткой, что и запрос, поэтому я не мог найти там никакой дополнительной информации.

Edit: Добавлена ​​еще некоторая информация о дальнейшем расследовании

После некоторого дальнейшего исследования, я обнаружил, что проблема не связана с HTTPS, так как запуск сайта в IIS по протоколу HTTP дает мне та же ошибка.

Однако журнала событий Windows показывает мне следующие данные:

Faulting application name: w3wp.exe, version: 8.5.9600.16384, time stamp:  0x52157ba0 
Faulting module name: clr.dll, version: 4.0.30319.34014, time stamp:  0x52e0b784 
Exception code: 0xc00000fd 
Fault offset: 0x00003022 
Faulting process id: 0xd00 
Faulting application start time: 0x01d0452cb0b43b02 
Faulting application path: C:\Windows\SysWOW64\inetsrv\w3wp.exe 
Faulting module path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll 
Report Id: f1876b51-b11f-11e4-8149-005056a1b9d2 
Faulting package full name: 
Faulting package-relative application ID: 

С наилучшими пожеланиями,

+0

Не можете ли вы удаленно подключиться к удаленному процессу iis и посмотреть, где проблема? – Nostradamus

+0

Это то, что я делаю, но тогда я получаю исключение StackOverflowException, даже не ударяя метод. – Complexity

+0

Вы используете какой-либо код для перенаправления с http на https? Попробуйте установить отладчик в Application_BeginRequest() – cosset

ответ

1

После многочасовых поисков, я нашел решение.

Код работал нормально на моем локальном компьютере, так как пул приложений IIS был настроен для запуска 64-битного приложения. На сервере он был настроен для запуска 32-разрядных приложений.

Как только я изменил его локально на 32 бит, я получил исключение StackOverflowException и мог начать отладку.

Оказалось, что это объект String. Я заменил его на StringBuilder, и теперь все работает отлично.

Смежные вопросы