2011-07-08 83 views
2

我最近遇到了一個問題,該問題不允許將DELETE和PUT請求用於我的.ashx文件,因此我添加了適當的動詞以允許訪問。現在我得到一個500內部服務器錯誤。這裏是我的處理程序的web.config:500嘗試訪問.ashx文件時發生內部服務器錯誤

<handlers> 
     <remove name="OPTIONSVerbHandler" /> 
     <remove name="WebServiceHandlerFactory-Integrated" /> 
     <remove name="svc-Integrated" /> 
     <remove name="WebDAV" /> 
     <add name="svc-Integrated" path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode" /> 
     <add name="OwssvrHandler" scriptProcessor="C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\isapi\owssvr.dll" path="/_vti_bin/owssvr.dll" verb="*" modules="IsapiModule" preCondition="integratedMode" /> 
     <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" /> 
     <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
     <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
     <add name="JSONHandlerFactory" path="*.json" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" resourceType="Unspecified" preCondition="integratedMode" /> 
     <add name="ReportViewerWebPart" verb="*" path="Reserved.ReportViewerWebPart.axd" type="Microsoft.ReportingServices.SharePoint.UI.WebParts.WebPartHttpHandler, Microsoft.ReportingServices.SharePoint.UI.WebParts, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" /> 
     <add name="ReportViewerWebControl" verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
    <add name="ashxhandler" path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="True" /> 
</handlers> 

這裏是HttpHandlers的:

<httpHandlers> 
<add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="True" /> 
    </httpHandlers> 

任何想法?我已經去了IIS 7,去了Request Filtering,添加了.ashx文件擴展名,將它設置爲true,然後在HTTP Verbs部分添加了DELETE,POST,GET,HEADER,PUT。

編輯:

這裏是我的ashx的文件:

<%@ WebHandler Language="C#" Class="jQueryUploadTest.Upload" %> 

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Security.AccessControl; 
using System.Web; 
using System.Web.Script.Serialization; 

namespace jQueryUploadTest { 

    public class Upload : IHttpHandler { 
     public class FilesStatus 
     {/* 
      public string thumbnail_url { get; set; } 
      public string name { get; set; } 
      public string url { get; set; } 
      public int size { get; set; } 
      public string type { get; set; } 
      public string delete_url { get; set; } 
      public string delete_type { get; set; } 
      public string error { get; set; } 
      public string progress { get; set; } 
      */ 

      private string m_thumbnail_url; 
      private string m_name; 
      private string m_url; 
      private int m_size; 
      private string m_type; 
      private string m_delete_url; 
      private string m_delete_type; 
      private string m_error; 
      private string m_progress; 

      public string thumbnail_url { get { return m_thumbnail_url; } set { m_thumbnail_url = value; } } 
      public string name { get { return m_name; } set { m_name = value; } } 
      public string url { get { return m_url; } set { m_url = value; } } 
      public int size { get { return m_size; } set { m_size = value; } } 
      public string type { get { return m_type; } set { m_type = value; } } 
      public string delete_url { get { return m_delete_url; } set { m_delete_url = value; } } 
      public string delete_type { get { return m_delete_type; } set { m_delete_type = value; } } 
      public string error { get { return m_error; } set { m_error = value; } } 
      public string progress { get { return m_progress; } set { m_progress = value; } } 
     } 
     private readonly JavaScriptSerializer js = new JavaScriptSerializer(); 
     private string ingestPath; 
     public bool IsReusable { get { return false; } } 
     public void ProcessRequest (HttpContext context) { 
      //var r = context.Response; 
      ingestPath = @"C:\temp\ingest\"; 

      context.Response.AddHeader("Pragma", "no-cache"); 
      context.Response.AddHeader("Cache-Control", "private, no-cache"); 

      HandleMethod(context); 
     } 

     private void HandleMethod (HttpContext context) { 
      switch (context.Request.HttpMethod) { 
       case "HEAD": 
       case "GET": 
        ServeFile(context); 
        break; 

       case "POST": 
        UploadFile(context); 
        break; 

       case "DELETE": 
        DeleteFile(context); 
        break; 

       default: 
        context.Response.ClearHeaders(); 
        context.Response.StatusCode = 405; 
        break; 
      } 
     } 

     private void DeleteFile (HttpContext context) { 
      string filePath = ingestPath + context.Request["f"]; 
      if (File.Exists(filePath)) { 
       File.Delete(filePath); 
      } 
     } 

     private void UploadFile (HttpContext context) { 
      List<FilesStatus> statuses = new List<FilesStatus>(); 
      System.Collections.Specialized.NameValueCollection headers = context.Request.Headers; 

      if (string.IsNullOrEmpty(headers["X-File-Name"])) { 
       UploadWholeFile(context, statuses); 
      } else { 
       UploadPartialFile(headers["X-File-Name"], context, statuses); 
      } 


      WriteJsonIframeSafe(context, statuses); 
     } 

     private void UploadPartialFile (string fileName, HttpContext context, List<FilesStatus> statuses) { 
      if (context.Request.Files.Count != 1) throw new HttpRequestValidationException("Attempt to upload chunked file containing more than one fragment per request"); 
      Stream inputStream = context.Request.Files[0].InputStream; 
      string fullName = ingestPath + Path.GetFileName(fileName); 

      using (FileStream fs = new FileStream(fullName, FileMode.Append, FileAccess.Write)) { 
       byte[] buffer = new byte[1024]; 

       int l = inputStream.Read(buffer, 0, 1024); 
       while (l > 0) { 
        fs.Write(buffer,0,l); 
        l = inputStream.Read(buffer, 0, 1024); 
       } 
       fs.Flush(); 
       fs.Close(); 
      } 
      FilesStatus MyFileStatus = new FilesStatus(); 
      MyFileStatus.thumbnail_url = "Thumbnail.ashx?f=" + fileName; 
      MyFileStatus.url = "Upload.ashx?f=" + fileName; 
      MyFileStatus.name = fileName; 
      MyFileStatus.size = (int)(new FileInfo(fullName)).Length; 
      MyFileStatus.type = "image/png"; 
      MyFileStatus.delete_url = "Upload.ashx?f=" + fileName; 
      MyFileStatus.delete_type = "DELETE"; 
      MyFileStatus.progress = "1.0"; 

      /* { 
       thumbnail_url = "Thumbnail.ashx?f=" + fileName, 
       url = "Upload.ashx?f=" + fileName, 
       name = fileName, 
       size = (int)(new FileInfo(fullName)).Length, 
       type = "image/png", 
       delete_url = "Upload.ashx?f=" + fileName, 
       delete_type = "DELETE", 
       progress = "1.0" 
      }; 
      */ 
      statuses.Add(MyFileStatus); 

     } 

     private void UploadWholeFile(HttpContext context, List<FilesStatus> statuses) { 
      for (int i = 0; i < context.Request.Files.Count; i++) { 
       HttpPostedFile file = context.Request.Files[i]; 
       file.SaveAs(ingestPath + Path.GetFileName(file.FileName)); 
       string fileName = Path.GetFileName(file.FileName); 
       FilesStatus MyFileStatus = new FilesStatus(); 
       MyFileStatus.thumbnail_url = "Thumbnail.ashx?f=" + fileName; 
       MyFileStatus.url = "Upload.ashx?f=" + fileName; 
       MyFileStatus.name = fileName; 
       MyFileStatus.size = file.ContentLength; 
       MyFileStatus.type = "image/png"; 
       MyFileStatus.delete_url = "Upload.ashx?f=" + fileName; 
       MyFileStatus.delete_type = "DELETE"; 
       MyFileStatus.progress = "1.0"; 
       statuses.Add(MyFileStatus); 
      } 
     } 

     private void WriteJsonIframeSafe(HttpContext context, List<FilesStatus> statuses) { 
      context.Response.AddHeader("Vary", "Accept"); 
      try { 
       if (context.Request["HTTP_ACCEPT"].Contains("application/json")) { 
        context.Response.ContentType = "application/json"; 
       } else { 
        context.Response.ContentType = "text/plain"; 
       } 
      } catch { 
       context.Response.ContentType = "text/plain"; 
      } 

      string jsonObj = js.Serialize(statuses.ToArray()); 
      context.Response.Write(jsonObj); 
     } 

     private void ServeFile (HttpContext context) { 
      if (string.IsNullOrEmpty(context.Request["f"])) ListCurrentFiles(context); 
      else DeliverFile(context); 
     } 

     private void DeliverFile (HttpContext context) { 
      string filePath = ingestPath + context.Request["f"]; 
      if (File.Exists(filePath)) { 
       context.Response.ContentType = "application/octet-stream"; 
       context.Response.WriteFile(filePath); 
       context.Response.AddHeader("Content-Disposition", "attachment, filename=\"" + context.Request["f"] + "\""); 
      } else { 
       context.Response.StatusCode = 404; 
      } 
     } 

     private void ListCurrentFiles (HttpContext context) { 
      List<FilesStatus> files = new List<FilesStatus>(); 

      string[] names = Directory.GetFiles(@"C:\temp\ingest", "*", SearchOption.TopDirectoryOnly); 

      foreach (string name in names) { 
       FileInfo f = new FileInfo(name); 
       FilesStatus MyFileStatus = new FilesStatus(); 
       MyFileStatus.thumbnail_url = "Thumbnail.ashx?f=" + f.Name; 
       MyFileStatus.url = "Upload.ashx?f=" + f.Name; 
       MyFileStatus.name = f.Name; 
       MyFileStatus.size = (int)f.Length; 
       MyFileStatus.type = "image/png"; 
       MyFileStatus.delete_url = "Upload.ashx?f=" + f.Name; 
       MyFileStatus.delete_type = "DELETE"; 

       files.Add(MyFileStatus); 
       /*files.Add(new FilesStatus 
       { 
        thumbnail_url = "Thumbnail.ashx?f=" + f.Name, 
        url = "Upload.ashx?f=" + f.Name, 
        name = f.Name, 
        size = (int)f.Length, 
        type = "image/png", 
        delete_url = "Upload.ashx?f=" + f.Name, 
        delete_type = "DELETE" 
       });*/ 
      } 

      context.Response.AddHeader("Content-Disposition", "inline, filename=\"files.json\""); 
      string jsonObj = js.Serialize(files.ToArray()); 
      context.Response.Write(jsonObj); 
      context.Response.ContentType = "application/json"; 
     } 
    } 
} 

錯誤:

XML Parsing Error: no element found 
Location: http://nbcddmsps01:87/_layouts/IrvineCompany.SharePoint.CLM/aspx/Upload.ashx?f=test.txt 
Line Number 1, Column 1: 

後,我加入到動詞我的web.config,所以我我只得到這個錯誤可以將DELETE和PUT請求調用到httphandler中

+0

您應該將ELMAH安裝到您的應用程序中,以便您可以獲得體面的未處理的錯誤日誌記錄,因爲Jordao表示這很可能是未處理的錯誤。 –

回答

1

該錯誤通常意味着您的處理程序c ode拋出了一個你的代碼沒有處理的異常。看一看。

+0

我已經上傳了代碼和錯誤,如果你可以看看,謝謝! – anthonypliu

相關問題