none
提问[孟子E章]在.net后台中使用MSXML2.XmlHttp后的发布问题 RRS feed

  • 问题

  • 使用孟老大的文章做的Demo(在.NET中利用XMLHTTP下载文件http://dotnet.aspx.cc/article/4ae836f8-ccb4-4bef-90b1-25bb1a5e6433/read.aspx),在IDE调试是通过的,但是一发布到IIS,网站就发生问题,

    Server Error in '/WebSite' Application.
    --------------------------------------------------------------------------------

    Operation aborted

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

    Exception Details: System.Runtime.InteropServices.COMException: Operation aborted


    Source Error: 


    Line 41: MSXML2.XMLHTTP _xmlhttp = new MSXML2.XMLHTTPClass(); 
    Line 42: _xmlhttp.open("GET", Url, false, null, null); 
    Line 43: _xmlhttp.send("");
    Line 44: if (_xmlhttp.readyState == 4)
    Line 45: {
     

    Source File: D:\Project\cris\TestForm\TestForm\index.aspx.cs Line: 43 

    Stack Trace: 


    [COMException (0x80004004): Operation aborted
    ]
      MSXML2.XMLHTTPClass.send(Object varBody) +0
      TestForm.index.Page_Load(Object sender, EventArgs e) in D:\Project\cris\TestForm\TestForm\index.aspx.cs:43
      System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14
      System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35
      System.Web.UI.Control.OnLoad(EventArgs e) +99
      System.Web.UI.Control.LoadRecursive() +50
      System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627

    源代码:

                            MSXML2.XMLHTTP xh = new MSXML2.XMLHTTPClass();
                           
                            //MSXML2.ServerXMLHTTP xh = new ServerXMLHTTPClass();
                            myurl = "http://www.baidu.com";
                            xh.open("POST", myurl, false, null, null);
                            xh.setRequestHeader("Content-Type", "text/html;charset=utf-8");
                            //xh.setRequestHeader("Content-Type", "utf-8");
                            xh.send("");

                            if (xh.readyState == 4)
                            {

                                if (xh.status == 200)
                                {
                                   Response.Redirect(myurl);

                                }
                            }

    2010年6月7日 7:02

答案

  • 服务器上也是可以使用的。

    前提是:你需要引用 Msxml3.dll,

    再次,你的服务器必须能够访问外网,

     

    另外,.NET下使用 HttpWebrequest是很好的


    【孟子E章】
    2010年6月9日 5:40
    版主
  • 你debug的时候看起来用的是VS内建的web服务器,这个用的是windows身份验证,所以页面在运行VS的用户会话下运行。

    发布到IIS之后页面在IIS的用户会话下运行。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年6月11日 14:46
    版主

全部回复

  • 修改源代码:

                        try
                        {
                            MSXML2.XMLHTTP xh = new MSXML2.XMLHTTPClass();
                           
                            //MSXML2.ServerXMLHTTP xh = new ServerXMLHTTPClass();
                            myurl = "http://www.baidu.com";
                            xh.open("POST", myurl, false, null, null);
                            xh.setRequestHeader("Content-Type", "text/html;charset=utf-8");
                            //xh.setRequestHeader("Content-Type", "utf-8");
                            xh.send("");

                           if (xh.readyState == 4)
                            {
                                if (xh.status == 200)
                                {
                                    Response.Redirect(myurl);                            }
                            }
                        }
                        //catch(System.Runtime.InteropServices.COMException ce)
                        //{
                        //    Console.WriteLine("COMException" + ce.Message + ce.StackTrace);
                        //    throw ce;
                        //}
                        catch (Exception ex)
                        {
                            Console.WriteLine("System Exception");// + ex.Message + ex.StackTrace);
                            string path = Server.MapPath("./ ");   //获得当前路径
                            StreamWriter sw = File.CreateText(path + "/test.txt");
                            sw.WriteLine(ex.Message + ex.StackTrace);
                            sw.Close();
                            sw.Dispose();

                            throw ex;
                        }

    页面错误如下:

    System error: -2146697208.

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

    Exception Details: System.IO.FileNotFoundException: System error: -2146697208.


    Source Error:


    Line 70:                         sw.Dispose();
    Line 71:
    Line 72:                         throw ex;
    Line 73:                     }
    Line 74:                 }
     

    Source File: D:\Project\cris\TestForm\TestForm\Default.aspx.cs    Line: 72

    Stack Trace:


    [FileNotFoundException: System error: -2146697208.
    ]
       TestForm._Default.Page_Load(Object sender, EventArgs e) in D:\Project\cris\TestForm\TestForm\Default.aspx.cs:72
       System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14
       System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35
       System.Web.UI.Control.OnLoad(EventArgs e) +99
       System.Web.UI.Control.LoadRecursive() +50
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627

     


    --------------------------------------------------------------------------------
    Version Information: Microsoft .NET Framework Version:2.0.50727.3603; ASP.NET Version:2.0.50727.3082

     

    文件test.txt错误:

    System error: -2146697208.
       at MSXML2.XMLHTTPClass.send(Object varBody)
       at TestForm._Default.Page_Load(Object sender, EventArgs e) in D:\Project\cris\TestForm\TestForm\Default.aspx.cs:line 36

    2010年6月7日 7:19
  • 你好!

         主要是文件没有找到导致的,你检查一下相关的文件是否存在,另外检查一下路径是否有问题!


    周雪峰
    2010年6月7日 14:23
    版主
  • 是哪一个文件没有找到呢?msxml2.dll在system32目录下的,如果这个不存在的话,那为什么IDE的调试环境就能通过呢?
    2010年6月8日 0:56
  • 不是文件没找到的问题。文件没找到是因为那个 CreateTemp 造成的。与 XMLHTTP 无关。

    请尝试用 Activator.CreateInstance 方法。如果是直接添加的 MSXML2 引用,则相应的 Interop 程序集也需要被同时部署。


    Mark Zhou
    2010年6月8日 9:34
  • 你好!

        你把try...catch先注释掉,就能发现具体是哪里抛出的异常了!


    周雪峰
    2010年6月8日 10:00
    版主
  • 不是文件没找到的问题。文件没找到是因为那个 CreateTemp 造成的。与 XMLHTTP 无关。

    请尝试用 Activator.CreateInstance 方法。如果是直接添加的 MSXML2 引用,则相应的 Interop 程序集也需要被同时部署。


    Mark Zhou


    我是直接添加引用MSXML2的,部署的时候,在bin目录下有Interop.MSXML2.dll

    CreateTemp 造成的??这个不是很明白,请解释下好吗?

     

    2010年6月8日 13:30
  • 你好!

        你把try...catch先注释掉,就能发现具体是哪里抛出的异常了!


    周雪峰


    我发布的第一个错误就是没有try..catch的,出错就是在_xmlhttp.send("");

    所以我不是很明白,如果是dll不存在的话,那么_xmlhttp就不应该被实例化啊。

    2010年6月8日 13:32
  • 而且最奇怪的是我在IDE环境,直接debug的时候是成功的,就是一发布到IIS网站,就报错了。
    2010年6月8日 14:03
  • 这个组件网络层用的是IE的WinInet,所以不支持在服务里面运行。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年6月8日 21:33
    版主
  • 服务器上也是可以使用的。

    前提是:你需要引用 Msxml3.dll,

    再次,你的服务器必须能够访问外网,

     

    另外,.NET下使用 HttpWebrequest是很好的


    【孟子E章】
    2010年6月9日 5:40
    版主
  • 我做了个测试地址,你可以看看

    http://dotnet.aspx.cc


    【孟子E章】

    2010年6月9日 6:00
    版主
  • 服务器上也是可以使用的。

    前提是:你需要引用 Msxml3.dll,

    再次,你的服务器必须能够访问外网,

     

    另外,.NET下使用 HttpWebrequest是很好的


    【孟子E章】


    这个我都确保了,通过测试,http开头的网站好像是成功了(我测试了baidu、google);

    https的网站在debug还是成功的,发布到IIS还是发生同样错误。

    2010年6月9日 11:00
  • 我做了个测试地址,你可以看看

    http://dotnet.aspx.cc


    【孟子E章】


    我使用你这个测试地址,同理https网站发生错误

     

    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

    异常详细信息: System.Runtime.InteropServices.COMException: 发生安全性问题。


    源错误:

    只有在调试模式下进行编译时,生成此未处理异常的源代码才会显示出来。若要启用此功能,请执行以下步骤之一,然后请求 URL:

    1. 在产生错误的文件的顶部添加一条“Debug=true”指令。例如:

      <%@ Page Language="C#" Debug="true" %>

    或:

    2. 将以下的节添加到应用程序的配置文件中:

    <configuration>
       <system.web>
           <compilation debug="true"/>
       </system.web>
    </configuration>

    请注意,第二个步骤将使给定应用程序中的所有文件在调试模式下进行编译;第一个步骤仅使该特定文件在调试模式下进行编译。

    重要事项: 以调试模式运行应用程序一定会产生内存/性能系统开销。在部署到生产方案之前,应确保应用程序调试已禁用。

    堆栈跟踪:

    [COMException (0x800c000e): 发生安全性问题。
    ]
     MSXML2.XMLHTTPClass.send(Object varBody) +0
     ASP.xmlhttp_aspx.Button1_Click(Object sender, EventArgs e) +202
     System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111
     System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110
     System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
     System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
     System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
     System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565
    

     

    “/”应用程序中的服务器错误。

    发生安全性问题。

     

     


    版本信息:  Microsoft .NET Framework 版本:2.0.50727.3603; ASP.NET 版本:2.0.50727.3614

    2010年6月9日 11:01
  • 我就是很奇怪,为什么debug都能通过,但是一发布到IIS就错误呢?按理说只要debug能过,发布的应该都可以通过的阿。
    2010年6月9日 11:03
  • xmlhttp所在的服务器是自己的,需要访问的地址(https)不是。查看系统消息中,应用程序有警告信息

    事件代码: 3005 
    事件消息: 发生了未处理的异常。 
    事件时间: 2010-6-8 22:12:02 
    事件时间(UTC): 2010-6-8 14:12:02 
    事件 ID: d10c7d10821844ea9936f4cc45be7d47 
    事件序列: 6 
    事件匹配项: 1 
    事件详细信息代码: 0 
     
    应用程序信息: 
      应用程序域: /LM/W3SVC/1/Root/xmlhttp-5-129204799213437500 
      信任级别: Full 
      应用程序虚拟路径: /xmlhttp 
      应用程序路径: c:\inetpub\wwwroot\xmlhttp\ 
      计算机名: HXP 
     
    进程信息: 
      进程 ID: 5972 
      进程名: aspnet_wp.exe 
      帐户名: HXP\ASPNET 
     
    异常信息: 
      异常类型: COMException 
      异常消息: 已终止操作
     
     
    请求信息: 
      请求 URL: http://localhost:8080/xmlhttp/Default.aspx 
      请求路径: /xmlhttp/Default.aspx 
      用户主机地址: 127.0.0.1 
      用户:  
      是否已经过身份验证: False 
      身份验证类型:  
      线程帐户名: HXP\ASPNET 
     
    线程信息: 
      线程 ID: 1 
      线程帐户名: HXP\ASPNET 
      是否正在模拟: False 
      堆栈跟踪: 在 MSXML2.XMLHTTPClass.send(Object varBody)
      在 XmlHttp._Default.Page_Load(Object sender, EventArgs e) 位置 G:\netCode\project\XmlHttp\XmlHttp\Default.aspx.cs:行号 31
      在 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
      在 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
      在 System.Web.UI.Control.OnLoad(EventArgs e)
      在 System.Web.UI.Control.LoadRecursive()
      在 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
     
     
    自定义事件详细信息: 

    有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持
    2010年6月9日 13:14
  • 前面已经说了,这个组件基于WinInet,所以不支持在服务里面运行。MSXML3里面这个组件一样是基于WinInet。

    服务用户里面用户的帐号信息默认没有被加载,所以无法加载用户配置中的SSL、代理服务器等配置。另外,WinInet也有并发数限制,不适合用于web环境。

    你可以换用基于winhttp的ServerXMLHTTP,或者直接用.Net的网络和XML支持类。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年6月9日 14:03
    版主
  • 前面已经说了,这个组件基于WinInet,所以不支持在服务里面运行。MSXML3里面这个组件一样是基于WinInet。

    服务用户里面用户的帐号信息默认没有被加载,所以无法加载用户配置中的SSL、代理服务器等配置。另外,WinInet也有并发数限制,不适合用于web环境。

    你可以换用基于winhttp的ServerXMLHTTP,或者直接用.Net的网络和XML支持类。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    我这个不是服务,就是一个空白的页面,在Page_Load方法中实现这个功能。如果是http的url已经可以实现了,现在就是在请求https地址时又报开始时发生的错误,就是xmlhttp.send那里。
    2010年6月10日 1:09
  • 我有尝试用ServerXMLHTTP,这个会报没有权限执行
    2010年6月10日 1:10
  • 采用https测试也是可以的啊

     

    https://www.google.com/images/logos/ssl_logo_lg.gif

     

    如果你的网站本身需要提供验证信息才能访问,那你访问的时候就需要提供用户名和密码,而不是null,null,

     


    【孟子E章】
    2010年6月10日 1:59
    版主
  • ASP.Net代码是在IIS服务里面运行的……

    ServerXMLTTP是在XML3.0 SP1才开始支持SSL

     



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年6月10日 2:14
    版主
  • 采用https测试也是可以的啊

     

    https://www.google.com/images/logos/ssl_logo_lg.gif

     

    如果你的网站本身需要提供验证信息才能访问,那你访问的时候就需要提供用户名和密码,而不是null,null,

     


    【孟子E章】

    目标htts的url是需要提供验证信息才能访问的,用户名和密码应该是要在页面弹出那个windows身份验证框等待用户手工输入的。

    这个原来的方法就是使用ajax访问这个目标地址,在send时也不需要提供username\password,页面会弹出那个验证框。 现在不是ajax跨域有安全问题吗,所以把这段ajax代码放到后台来做,其实就是一个空白页面的Page_Load方法体里执行类似的操作。debug模式下http://localhost:1637/default.aspx 也会弹出那个验证对话框的。就是发布到本机的IIS,通过http://localhost/default.aspx  页面访问会报刚开始提的那个错误。

    现在的问题焦点就是 debug模式页面访问 和 正式发布的页面访问 为什么结果会不一样,debug正确,而正式的就会报错。


     

    2010年6月10日 3:19
  • ASP.Net代码是在IIS服务里面运行的……

    ServerXMLTTP是在XML3.0 SP1才开始支持SSL

     



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    这个我还在调试中,等晚上有结果了,我会把我的结果发上来。
    2010年6月10日 3:21
  • ajax是在客户端的,弹出登录框你是可以看到的。

    你在服务器上运行,即使弹出来,你也看不到的。你需要在程序中传递登录信息


    【孟子E章】
    2010年6月10日 5:50
    版主
  • ajax是在客户端的,弹出登录框你是可以看到的。

    你在服务器上运行,即使弹出来,你也看不到的。你需要在程序中传递登录信息


    【孟子E章】

    我这个也不算是完全的服务端啊,应该既是服务端,也是客户端的。

    就是用户一定要打开我这个页面才可以的,不就和ajax一样了?也就是这个页面的前端的javascript放到后面code-behind去了而已,如果是以前的asp网站,不还是一个文件?

    2010年6月10日 13:47
  • ajax是在客户端的,弹出登录框你是可以看到的。

    你在服务器上运行,即使弹出来,你也看不到的。你需要在程序中传递登录信息


    【孟子E章】

    我这个也不算是完全的服务端啊,应该既是服务端,也是客户端的。

    就是用户一定要打开我这个页面才可以的,不就和ajax一样了?也就是这个页面的前端的javascript放到后面code-behind去了而已,如果是以前的asp网站,不还是一个文件?

    在退一步说,就是我发布到本机的IIS,至少我打开这个页面应该能看到登录框的。

    现在问题的重心不在这里,<span style="color:red;">而是debug模式下http://localhost:1637/default.aspx 也会弹出那个验证对话框的。就是发布到本机的IIS,通过http://localhost/default.aspx  页面访问会报刚开始提的那个错误。

    现在的问题焦点就是 debug模式页面访问 和 正式发布的页面访问 为什么结果会不一样,debug正确,而正式的就会报错。</span>

    2010年6月10日 13:51
  • 使用MSXML2.ServerXMLHTTP _xmlhttp = new ServerXMLHTTPClass();则是报证书错误:A certificate is required to complete client authentication
    2010年6月10日 14:35
  • 你的服务器需要客户端提供自己的证书来做身份验证?

    在服务用户装证书比较麻烦,参考http://support.microsoft.com/kb/301429



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年6月10日 14:54
    版主
  • 你的服务器需要客户端提供自己的证书来做身份验证?

    在服务用户装证书比较麻烦,参考http://support.microsoft.com/kb/301429



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    服务器是指我请求的https所在机器?不需要证书的,只是集成了windows身份验证,如果是用ie打开,会弹出身份验证对话框,不会要求安装证书。
    2010年6月10日 15:16
  • 服务里面进行Windows身份验证的话应该先切换用户身份吧?

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年6月10日 18:51
    版主
  • 服务里面进行Windows身份验证的话应该先切换用户身份吧?

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    这个具体指哪里? 这个功能不用想象成为服务,就只是很简单的一个页面上的按钮事件。点击按钮,会去请求https目标网页,然后就是弹出验证对话框,输入用户名和密码,显示目标网页的内容。
    2010年6月11日 1:30
  • 现在抛开所有问题,专注下面这个问题。

     

    1。 debug模式下http://localhost:1637/default.aspx 会弹出那个验证对话框的。

    2。 发布到本机的IIS,通过http://localhost/default.aspx  页面访问会报刚开始提的那个错误。

    现在的问题焦点就是 debug模式页面访问 和 正式发布的页面访问 为什么结果会不一样,debug正确,而正式的就会报错。

    2010年6月11日 13:27
  • 你debug的时候看起来用的是VS内建的web服务器,这个用的是windows身份验证,所以页面在运行VS的用户会话下运行。

    发布到IIS之后页面在IIS的用户会话下运行。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年6月11日 14:46
    版主
  • 你debug的时候看起来用的是VS内建的web服务器,这个用的是windows身份验证,所以页面在运行VS的用户会话下运行。

    发布到IIS之后页面在IIS的用户会话下运行。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    对的,就是这个问题,VS内建的web服务器IIS 之间的区别。
    2010年6月12日 2:06
  • 现在的问题焦点就回到了

    VS内建的web服务器IIS 之间的区别。

    2010年6月13日 0:48
  • 自己再顶一下
    2010年6月15日 10:52