2012-05-03 3 views
0

Я был слишком долго, и я уверен, что кто-то там сможет указать мою ошибку за считанные секунды.Ошибка сервера после изменения текущего httprequest

У моей компании есть приложение ipad, которое загружает материалы для продаж для наших продавцов (powerpoints, videos и т. Д.). Все ресурсы находятся в библиотеке документов внутри SharePoint. Вместо того чтобы сделать библиотеку документов общедоступной (и менее безопасной), я создал страницу .aspx с веб-частью на ней, которая извлекает документы. Приложение ipad связывается с страницей .aspx и отправляет два запроса: «токен» и «документ». Знак по существу является паролем, поэтому веб-часть знает, что он поступает из приложения ipad. Если токен верен, веб-часть будет извлекать любой документ.

вот моя проблема. Документ получает и поставляется так же, как и должен, но если я попытаюсь загрузить другой документ или перейду в другое место на сервере, я получаю ошибку сервера. Мне нужно закрыть браузер (или завершить сеанс).

Ошибка я получаю объясняется здесь: http://blog.tylerholmes.com/2008/07/problem-with-sharepoint.html

Я не хочу использовать затруднительное на этом блоге, однако, потому что я знаю, что мой код вызывает проблему, и я хочу исправить корень проблемы.

Мой веб-часть кода ниже:

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(); 
    } 

Любая помощь будет высоко ценится!

+0

Вы действительно уверены, что связанная с вами ошибка была ошибкой? Я спрашиваю об этом, потому что iPad (или, более конкретно, Mobile Safari) имеет большие проблемы с обработкой цепочки ответов 401,401,200, требуемой NTLM. –

+0

Да, потому что я еще не тестировал приложение iPad. Я просто набираю URL-адрес в браузере, чтобы убедиться, что веб-часть получает и правильно доставляет документ. Вся цель этой веб-части - обработать всю аутентификацию, поэтому iPad-приложение не обязательно. – willink

ответ

0

Хорошо, я нашел решение. Все, что мне нужно было сделать, это удалить HttpContext.Current.Response.Flush(); линия. Оказывается, следующая строка кода, HttpContext.Current.Response.End(); делает то же самое, что и метод Flush, он отправляет ответный запрос клиенту. По какой-то причине сервер не нравится, когда вы вызываете оба этих метода. Надеюсь, это поможет кому-то!