【问题标题】:DevExpress ASPxUploadControl throwing unspecified errorDevExpress ASPxUploadControl 引发未指定的错误
【发布时间】:2016-01-06 16:02:08
【问题描述】:

如果我的网站上有一个上传控件定义为:

<dx:ASPxUploadControl ID="ucStatement" runat="server" Width="200px" 
ClientInstanceName="ucStatement" ClientVisible="true" AutoStartUpload="True" 
OnFileUploadComplete="ucStatement_FileUploadComplete" 
OnInit="ucStatement_Init"></dx:ASPxUploadControl>

ucStatement_FileUploadComplete定义如下,以后使用ms时:

MemoryStream ms;

protected void ucStatement_FileUploadComplete(object sender, FileUploadCompleteEventArgs e)
{
    if (!e.UploadedFile.IsValid)
        return;

    ms = new MemoryStream();

    e.UploadedFile.FileContent.CopyTo(ms);
}

在服务器上它确实可以工作,但是由于我们的安全技术人员更改了 Web 配置以符合一些安全考虑,它抛出了错误:

服务器遇到了一个内部未指定的错误,阻止了它 完成请求。

对于为什么此功能不再起作用的原因,Web 配置更改显然排在首位,但它们是非常小的更改,不应该影响这一点。

从 DevExpress 网站上的各种帖子中查看这一点,有很多原因导致他们说它可能会被抛出以及如何缓解它。最相关的帖子是https://www.devexpress.com/Support/Center/Question/Details/KA18611

解决那里提出的问题:

1.1 当总请求长度超过“system.web > httpRuntime > maxRequestLength”Web.config 键所允许的最大值时,通常会出现此问题

我只是想上传一个 ~4kb 的文件,我已经按照建议在网络配置中进行了设置:

<system.web>
    <httpRuntime maxRequestLength="4096" />
    ...
</system.web>

<system.webServer>
    ...
    <security>
        <requestFiltering>
            <requestLimits maxAllowedContentLength="30000000" />
        </requestFiltering>
    </security>
</system.webServer>

我也不会将 UploadMode 更改为 Advanced,因为我不想强制执行 Silverlight。


编辑: 进一步调查显示DXR.axd 中的一个名为GetFakeIframeDocument 的方法抛出了我只能在 DevEx 工作人员说请求长度大于maxRequestLength 时才引用的错误,但是当然不是这样。您是否可以在本文底部的 web.config 中看到任何可以否定此设置的内容?或者根本不允许任何上传?


1.2 当网络服务器返回意外的响应/代码时,也会发生这种情况。

他们建议将FileUploadMode 更改为OnPageLoad。在这里这样做会产生同样的错误。

1.3 在 Web.config 文件中启用跟踪也可能导致“服务器遇到内部未指定错误导致其无法完成请求”错误。

web.config 中未设置跟踪

1.4 是否可以自定义/覆盖“服务器遇到内部未指定错误,导致其无法完成请求”错误消息?

他们建议通过捕获所有回调错误来捕获错误。我已经这样做了:

void Application_Start(object sender, EventArgs e) {
    DevExpress.Web.ASPxWebControl.CallbackError += new EventHandler(Application_Error);
}

void Application_Error(object sender, EventArgs e)
{
    HttpServerUtility server = HttpContext.Current.Server;
    Exception ex = server.GetLastError();

    if (ex is HttpUnhandledException)
        ex = ex.InnerException;

    ProcessException(ex)
}

ProcessException 做了许多不同的事情,写入事件日志,写入错误日志文件并插入 SQL 数据库。

如果应用程序的任何其他部分抛出错误,所有这些功能都会起作用。当上传控件抛出错误时,不会记录任何内容。

那么,这可能是什么原因造成的?为什么这个错误不会命中Application_Error 函数?我该怎么办?

以下是完整披露的 web.config:

<configuration>
  <configSections>
    <sectionGroup name="devExpress">
      <section name="themes" type="DevExpress.Web.ThemesConfigurationSection, DevExpress.Web.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" requirePermission="false" />
      <section name="compression" type="DevExpress.Web.CompressionConfigurationSection, DevExpress.Web.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" requirePermission="false" />
      <section name="settings" type="DevExpress.Web.SettingsConfigurationSection, DevExpress.Web.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" requirePermission="false" />
      <section name="errors" type="DevExpress.Web.ErrorsConfigurationSection, DevExpress.Web.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <connectionStrings>
    <add connectionString="xxxxx" name="myConnectionString" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <system.web>
    <httpCookies httpOnlyCookies="true" requireSSL="true"/>
    <compilation debug="false" targetFramework="4.5">
      <assemblies>
        <add assembly="DevExpress.Data.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.Web.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.Web.ASPxHtmlEditor.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.Web.ASPxSpellChecker.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.Web.ASPxTreeList.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.Web.ASPxThemes.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.Web.ASPxPivotGrid.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.Utils.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.Office.v14.2.Core, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.RichEdit.v14.2.Core, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.SpellChecker.v14.2.Core, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.Charts.v14.2.Core, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.XtraCharts.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.XtraGauges.v14.2.Core, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.XtraGauges.v14.2.Presets, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.Web.ASPxGauges.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.XtraCharts.v14.2.Web, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.Printing.v14.2.Core, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.XtraReports.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.XtraReports.v14.2.Web, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.XtraPivotGrid.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.PivotGrid.v14.2.Core, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.XtraScheduler.v14.2.Core, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.Web.ASPxScheduler.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.Spreadsheet.v14.2.Core, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
        <add assembly="DevExpress.Web.ASPxSpreadsheet.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
      </assemblies>
    </compilation>
    <authentication mode="Windows" />
    <profile>
      <providers>
        <clear />
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/" />
      </providers>
    </profile>
    <roleManager enabled="false">
      <providers>
        <clear />
        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
        <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
      </providers>
    </roleManager>
    <sessionState timeout="5"></sessionState>
    <httpHandlers>
      <add type="DevExpress.Web.ASPxUploadProgressHttpHandler, DevExpress.Web.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" verb="GET,POST" path="ASPxUploadProgressHandlerPage.ashx" validate="false" />
      <add type="DevExpress.Web.ASPxHttpHandlerModule, DevExpress.Web.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" verb="GET,POST" path="DX.ashx" validate="false" />
    </httpHandlers>
    <httpModules>
      <add type="DevExpress.Web.ASPxHttpHandlerModule, DevExpress.Web.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" name="ASPxHttpHandlerModule" />
    </httpModules>
    <globalization culture="" uiCulture="" />
    <httpRuntime maxRequestLength="4096" requestValidationMode="4.0" executionTimeout="110" />
    <pages validateRequest="true" clientIDMode="AutoID">
      <controls>
        <add tagPrefix="dx" namespace="DevExpress.Web" assembly="DevExpress.Web.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
      </controls>
    </pages>
        <authorization>
            <allow users="*" />
        </authorization>
        <machineKey decryption="AES" validation="AES" />
        <trust level="Full" />
  </system.web>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add type="DevExpress.Web.ASPxHttpHandlerModule, DevExpress.Web.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" name="ASPxHttpHandlerModule" />
    </modules>
    <handlers>
      <add type="DevExpress.Web.ASPxUploadProgressHttpHandler, DevExpress.Web.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" verb="GET,POST" path="ASPxUploadProgressHandlerPage.ashx" name="ASPxUploadProgressHandler" preCondition="integratedMode" />
      <add type="DevExpress.Web.ASPxHttpHandlerModule, DevExpress.Web.v14.2, Version=14.2.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" verb="GET,POST" path="DX.ashx" name="ASPxHttpHandlerModule" preCondition="integratedMode" />
    </handlers>
    <validation validateIntegratedModeConfiguration="false" />
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="30000000" />
                <fileExtensions allowUnlisted="true">
                </fileExtensions>
      </requestFiltering>
    </security>
        <httpErrors errorMode="Custom" />
    <httpProtocol>
      <customHeaders>
        <add name="X-Frame-Options" value="DENY" />
        <add name="X-Content-Type-Options" value="no sniff"/>
      </customHeaders>
    </httpProtocol>
  </system.webServer>
  <devExpress>
    <themes enableThemesAssembly="true" styleSheetTheme="" theme="Metropolis" customThemeAssemblies="" />
    <compression enableHtmlCompression="false" enableCallbackCompression="true" enableResourceCompression="true" enableResourceMerging="true" />
    <settings doctypeMode="Html5" rightToLeft="false" embedRequiredClientLibraries="true" ieCompatibilityVersion="edge" />
    <errors callbackErrorRedirectUrl=""/>
  </devExpress>
</configuration>

【问题讨论】:

    标签: c# asp.net file-upload devexpress


    【解决方案1】:

    在我意识到GetFakeIframeDocument 方法中引发了错误后,我搜索了 web.config 以查找可能与 iframe 相关的任何内容。在httpProtocol > customHeaders 中有元素:

     <add name="X-Frame-Options" value="DENY" />
    

    这会阻止任何 iframe 显示网站内容。将 value 更改为 SAMEORIGIN 允许站点使用 iframe 显示站点内容,但不允许任何外部 iframe 显示站点内容。当我将上面的 web.config 元素更改为:

     <add name="X-Frame-Options" value="SAMEORIGIN" />
    

    【讨论】:

    • 奇怪的是,我已经有了 SAMEORIGIN,但现在我自己突然遇到了这个错误(4 年后)。运行 DevExpress 13.1.8(我知道很古老)。如果我发现问题所在,我会回复。
    • 对于任何好奇的人,一旦我从 web.config 中注释掉 X-Frame 行,错误就消失了。我不知道为什么 SAMEORIGIN 还没有工作 - 如果/当我找到修复程序时,我会在这里发布。
    猜你喜欢
    • 2019-04-03
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多