-3

私は、asp.net c# といくつかの jquery 機能で構築された Web サイトを持っています。デバッグ モードでコードを実行しない限り、すべての機能 (ファイルの削除など) が機能しないことがわかりました。localhost (iis) のサイトではどの機能も機能しません

ファイル ハンドラー (FileTransferHandler.ashx) を使用して、ファイルの削除、アップロードを行っています。上で述べたように、デバッグモードでコードをステップ実行すると機能しますが、localhost(iis) で実行すると機能しません

私が今得ているように見えるエラーは次のとおりです: 405 無効なメソッド (HTTP 動詞) が使用されているため、探しているページを表示できません

ここにコードがあります

using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Script.Serialization;
using System.Web.SessionState;

public class FileTransferHandler : IHttpHandler, IReadOnlySessionState
{
    private readonly JavaScriptSerializer js = new JavaScriptSerializer();


    public string StorageRoot
    {

        get { return ConfigurationManager.AppSettings["StorageRoot"] ; }
    }
    public bool IsReusable { get { return false; } }

    public void ProcessRequest(HttpContext context)
    {
        context.Response.AddHeader("Pragma", "no-cache");
        context.Response.AddHeader("Cache-Control", "private, no-cache");

        HandleMethod(context);
    }

    // Handle request based on method
    private void HandleMethod(HttpContext context)
    {
        switch (context.Request.HttpMethod)
        {
            case "HEAD":
            case "GET":
                if (GivenFilename(context)) DeliverFile(context);
                else ListCurrentFiles(context);
                break;

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

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

            case "OPTIONS":
                ReturnOptions(context);
                break;

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

    private static void ReturnOptions(HttpContext context)
    {
        context.Response.AddHeader("Allow", "DELETE,GET,HEAD,POST,PUT,OPTIONS");
        context.Response.StatusCode = 200;
    }

    // Delete file from the server
    private void DeleteFile(HttpContext context)
    {
        var filePath = StorageRoot + context.Session["uname"].ToString() + "/" + context.Request["f"];
        if (File.Exists(filePath))
        {
            File.Delete(filePath);
        }
    }

    // Upload file to the server
    private void UploadFile(HttpContext context)
    {
        var statuses = new List<FilesStatus>();
        var 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);
    }

    // Upload partial file
    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");
        var inputStream = context.Request.Files[0].InputStream;
        var fullName = StorageRoot+ context.Session["uname"].ToString() + "/"  + Path.GetFileName(fileName);

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

            var l = inputStream.Read(buffer, 0, 1024);
            while (l > 0)
            {
                fs.Write(buffer, 0, l);
                l = inputStream.Read(buffer, 0, 1024);
            }
            fs.Flush();
            fs.Close();
        }
        statuses.Add(new FilesStatus(new FileInfo(fullName)));
    }

    // Upload entire file
    private void UploadWholeFile(HttpContext context, List<FilesStatus> statuses)
    {
        for (int i = 0; i < context.Request.Files.Count; i++)
        {
            var file = context.Request.Files[i];
            file.SaveAs(StorageRoot + context.Session["uname"].ToString()+ "/"  + Path.GetFileName(file.FileName));

            string fullName = Path.GetFileName(file.FileName);
            statuses.Add(new FilesStatus(fullName, file.ContentLength));
        }
    }

    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";
        }

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

    private static bool GivenFilename(HttpContext context)
    {
        return !string.IsNullOrEmpty(context.Request["f"]);
    }

    private void DeliverFile(HttpContext context)
    {
        var filename = context.Request["f"];
        var filePath = StorageRoot  + context.Session["uname"].ToString() + "/"+ filename;

        if (File.Exists(filePath))
        {
            context.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
            context.Response.ContentType = "application/octet-stream";
            context.Response.ClearContent();
            context.Response.WriteFile(filePath);
        }
        else
            context.Response.StatusCode = 404;
    }

    private void ListCurrentFiles(HttpContext context)
    {
        var files =
            new DirectoryInfo(StorageRoot + "/" + context.Session["uname"].ToString())
                .GetFiles("*", SearchOption.TopDirectoryOnly)
                .Where(f => !f.Attributes.HasFlag(FileAttributes.Hidden))
                .Select(f => new FilesStatus(f))
                .ToArray();

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

2 に答える 2

0

私もこの問題に直面していましたが、ブラウザの Cookie とキャッシュをクリアした後、解決されました。

于 2013-09-04T08:39:53.217 に答える
0

ありがとう、必要な動詞をiisの.ashxファイルハンドラーに追加することで解決しました

于 2013-09-04T17:12:54.323 に答える