在mod_mono(3.12.1)上运行的XHR代理中的System.Threading.ThreadAbortException

时间:2015-04-13 20:30:55

标签: c# asp.net linux mono mod-mono

我有一个.NET 2.0应用程序,我有兴趣移植到mod_mono下的Linux上运行。

应用程序的一部分是XHR代理,它提供对提供给前端的各种数据馈送的访问。此代理脚本确保用户具有有效会话,然后确保用户有权获取他们尝试检索的数据。最后,如果请求,代理将使用Newtonsoft将XML转换为JSON。

此服务的URL如下所示:

/ApiProxy.aspx?url=http%3A%2F%2Fexample%2Fapi%2Fservice

出于某种原因,我无法在mod_mono下运行这个软件。它会产生以下错误:

System.Threading.ThreadAbortException
Thread was being aborted
Description: HTTP 500.Error processing request.
Details: Non-web exception. Exception origin (name of application or object): mscorlib.
Exception stack trace:
  at (wrapper managed-to-native) System.Threading.Thread:Abort_internal (System.Threading.InternalThread,object)
  at System.Threading.Thread.Abort (System.Object stateInfo) [0x00000] in <filename unknown>:0 
  at System.Web.HttpResponse.End () [0x00000] in <filename unknown>:0 
  at ASP.apiproxy_aspx.__RenderTree (System.Web.UI.HtmlTextWriter __output, System.Web.UI.Control parameterContainer) [0x00000] in <filename unknown>:0 

我真的不知道该怎么做这个错误。

它似乎没有引用我的任何代码,也没有提供任何关于问题所在位置的提示。我有一个线索是,有一些大块似乎与问题有关:

using(SqlConnection con = new SqlConnection(myConnectionString))
{
    con.Open();

    //1) determine if the user is allowed to get the service
    //2) retrieve the content the user is requesting
    //3) convert the content to json

    } catch (Exception ex){
        throw new Exception("Unhandled exception", ex);
    } finally {
        if(con != null)
            con.Close();
    }
}

当我注释掉try / catch / finally块时,行为会发生一些变化,但最终结果仍然是错误。这次赤裸裸的400无效请求错误。

我真的不知道从哪里开始,所以我猜我有两个问题:

  1. 导致此错误的原因是什么?
  2. 如何获得更好的诊断信息?

1 个答案:

答案 0 :(得分:1)

最可能的原因是您在处理请求时遇到超时。在web.config中增加超时并且错误应该消失。

<location path="apiproxy.aspx">
    <system.web>
        <httpRuntime executionTimeout="180"/> <!-- set large value here -->
    </system.web>
</location>

此处为单https://github.com/mono/mono/blob/master/mcs/class/System.Web/System.Web/HttpResponse.cs#L631-L638

HttpResponse.End ()方法的代码
    public void End ()
    {
        if (context == null)
            return;

        if (context.TimeoutPossible) {
            Thread.CurrentThread.Abort (FlagEnd.Value);
        } else {