1

HttpHandlers を使用する前に、それに応じてタグを web.xml に追加することでこれを達成しました。ここにコードをコピーすることもできます..

private readonly string[] SupportedExtensions = new[] { "*.docx", ".pptx", "xlsx" };
private void AddForSharePoint2007()
    {
        // SP2007 uses IIS6.0 compatibility mode
        SPWebService contentService = SPWebService.ContentService;

        // the Name must be XPATH of Value.. otherwise SP wont remove!
        SPWebConfigModification item = new SPWebConfigModification
        {
            Owner = FeatureId,
            Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode,
            Path = "/configuration/system.web/httpHandlers",
            Name = "add[@verb=\"*\"][@path=\"" + string.Join(",", SupportedExtensions) + "\"][@type=\"MyNamespace.DownloadHandler, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=*****\"]",
            Value = "<add verb=\"*\" path=\"" + string.Join(",", SupportedExtensions) + "\" type=\"MyNamespace.DownloadHandler, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=******\"/>"
        };

        contentService.WebConfigModifications.Add(item);
        contentService.Update();
        contentService.ApplyWebConfigModifications();
    }


    private void AddForSharePoint2010()
    {
        // SP2010 requires IIS7.0
        const string valueTemplate = "<add name=\"DownloadHandler for {0}\" path=\"{1}\" verb=\"*\" type=\"MyNamespace.DownloadHandler, MyProject, Version=4.13.0.0, Culture=neutral, PublicKeyToken=******\"/>";
        const string xpathTemplate = "add[@name=\"DownloadHandler for {0}\"][@path=\"{1}\"][@verb=\"*\"][@type=\"MyNamespace.DownloadHandler, MyProject, Version=4.13.0.0, Culture=neutral, PublicKeyToken=******\"]";
        SPWebService contentService = SPWebService.ContentService;

        foreach (var extension in SupportedExtensions)
        {
            // the Name must be XPATH of Value.. otherwise SP wont remove!
            SPWebConfigModification item = new SPWebConfigModification()
            {
                Owner = FeatureId,
                Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode,
                Path = "/configuration/system.webServer/handlers",
                Name = string.Format(xpathTemplate,extension.Replace("*.", string.Empty), extension),
                Value = string.Format(valueTemplate, extension.Replace("*.", string.Empty), extension)
            };

            contentService.WebConfigModifications.Add(item);
        }

        contentService.Update();
        contentService.ApplyWebConfigModifications();
    }

リストからわかるようにSupportedExtensions、これらのファイル拡張子に対して HTTPHandler が呼び出されます。今回は、Sharepoint のドキュメント ライブラリからのすべてのファイル ダウンロードをインターセプトする必要があります。単純に「*」と定義することもできますSupportedExtensionsが、css、js、image、html リクエストなど、Sharepoint の HTTP リクエストごとにハンドラーが呼び出されます。これは大きなパフォーマンスの問題につながります。それは明らかに受け入れられません。

私の質問は、ドキュメント ライブラリからのファイル リクエストのみに対して HTTPHandler を登録して実装することは可能ですか? または、Sharepoint 自身のファイルとファイル リクエストを区別できる非常に効率的なハンドラーを作成しますか?

4

0 に答える 0