当试图访问.ashx文件时,内部服务器错误



我最近遇到了一个问题,它不允许我在.ashx文件中使用DELETE和PUT请求,因此我添加了适当的动词以允许这种访问。现在我得到一个500内部服务器错误。这是我的网。处理程序的配置:

<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 FilesCommon FilesMicrosoft SharedWeb Server Extensions14isapiowssvr.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,进入请求过滤,添加了。ashx文件扩展名,将其设置为true,然后在HTTP动词部分我添加了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:tempingest";
            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:tempingest", "*", 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:

我只得到这个错误后,我添加动词到我的网页。配置,以便我可以调用DELETE和PUT请求到httphandler

这个错误通常意味着你的处理程序代码抛出了一个你的代码没有处理的异常。

最新更新