0

私はこれにあまりにも長い間取り組んできましたが、誰かが私の間違いをほんの数秒で指摘できると確信しています.

私の会社には、セールスマン向けの販売資料 (パワーポイント、ビデオなど) をダウンロードする iPad アプリがあります。すべてのリソースは、SharePoint 内のドキュメント ライブラリにあります。ドキュメント ライブラリを公開する (そして安全性を低くする) 代わりに、ドキュメントをフェッチする Web パーツを含む .aspx ページを作成しました。iPad アプリは .aspx ページにアクセスし、「token」と「document」という 2 つのクエリを送信します。トークンは基本的にパスワードであるため、Web パーツはそれが iPad アプリからのものであることを認識します。トークンが正しい場合、Web パーツは指定されたドキュメントを取得します。

これが私の問題です。ドキュメントは取得されて配信されますが、別のドキュメントをダウンロードしようとしたり、サーバー上の別の場所に移動しようとすると、サーバー エラーが発生します。ブラウザーを閉じる必要があります (つまり、セッションを終了します)。

私が得ているエラーはここで説明されています: http://blog.tylerholmes.com/2008/07/problem-with-sharepoint.html

ただし、私のコードが問題の原因であることがわかっており、問題の根本を修正したいので、そのブログの修正を使用したくありません。

私の Web パーツ コードは次のとおりです。

protected override void CreateChildControls()
    {
        string toRender = string.Empty;
        SPWeb webInUserContext = SPContext.Current.Web;
        SPSite SiteInUserContext = SPContext.Current.Site;
        Guid webGuid = webInUserContext.ID;
        Guid siteGuid = SiteInUserContext.ID;

         //gives visitors the authority to see the dam data
        SPSecurity.RunWithElevatedPrivileges(delegate()
        {
            using (SPSite site = new SPSite(siteGuid))
            {
                using (SPWeb web = site.OpenWeb(webGuid))
                {
                    using (DAM dam = new DAM())
                    {
                        String mystring = HttpContext.Current.Request.Url.AbsoluteUri;
                        //If the request contains the correct token
                        if (mystring.ToString().Contains("REgrgg0434GgdLk6"))
                        {
                            //Get the document data into a byte array
                            byte[] buf = new byte[0];
                            using (var wc = new System.Net.WebClient())
                            {
                                //Right now I'm just hard-coding a document url for testing, rather than
                                //getting it from the url query
                                String url = "http://web-dev/sites/damedit/DocLibrary/document.ppt";
                                System.Net.CredentialCache cc = new System.Net.CredentialCache();
                                cc.Add(new Uri(url), "NTLM", new System.Net.NetworkCredential("username", "password", "domain"));
                                wc.Credentials = cc;
                                buf = wc.DownloadData(url);
                            }

                            //Rewrite the current response so that it contains the document
                            HttpContext.Current.Response.Clear();
                            HttpContext.Current.Response.ContentType = "application/pdf";
                            HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"document.ppt\"");
                            HttpContext.Current.Response.BinaryWrite(buf);
                            HttpContext.Current.Response.Flush();
                            HttpContext.Current.Response.End();
                        }
                    }
                }
            }
        });
        base.CreateChildControls();
    }

どんな助けでも大歓迎です!

4

1 に答える 1

0

さて、私は解決策を見つけました。私がしなければならなかったのは、HttpContext.Current.Response.Flush();を削除することだけでした。ライン。次のコード行HttpContext.Current.Response.End();が Flush メソッドと同じことを行い、応答出力をクライアントに送信します。何らかの理由で、これらのメソッドを両方とも呼び出すと、サーバーはそれを好みません。これが誰かを助けることを願っています!

于 2012-05-04T18:25:17.290 に答える