2015-06-22 2 views
3

Я новичок в WCF, я создал одну службу для httpwebrequest для отчета SSRS и отрисую отчет в формате PDF или EXCEL и сохранил его в определенном месте на диске.Httpwebrequest from wcf service

Я вызываю эту службу из веб-приложения при нажатии кнопки. Но это дает ошибку на GetResponse()

The remote server returned an error: (403) Forbidden 

Кроме того, у меня есть создать такое же код в консольном приложении, он отлично работает.

ниже мой код

public class ReportGenerator : IReportGenerator 
    { 
     public void ReportRequest() 
     { 
      try 
      { 
       string URL = "http://localhost/ReportServer2008?/ssrswcf/ssrswcftest"; 
       string Command = "Render"; 
       string Format = "PDF";//"EXCEL" 

       URL = URL + "&rs:Command=" + Command + "&rs:Format=" + Format + "&sid=5"; 

       System.Net.HttpWebRequest Req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(URL); 

       Req.UseDefaultCredentials = true; 
       Req.Method = "GET"; 

       string path = @"C:\ssrswcftest\" + Convert.ToString(Guid.NewGuid()) + @".pdf"; 

       System.Net.WebResponse objResponse = Req.GetResponse(); 
       System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Create); 
       System.IO.Stream stream = objResponse.GetResponseStream(); 

       byte[] buf = new byte[1024]; 
       int len = stream.Read(buf, 0, 1024); 
       while (len > 0) 
       { 
        fs.Write(buf, 0, len); 
        len = stream.Read(buf, 0, 1024); 
       } 
       stream.Close(); 
       fs.Close(); 
      } 
      catch (WebException ex) 
      { 
       // 
      } 
      catch (Exception ex) 
      { 
       // 
      } 
     } 
    } 

Ниже подробно скрипач

WCF, размещенный с помощью IIS, имеющей ошибку

заголовка запроса

GET /ReportServer2008?/ssrswcf/ssrswcftest&rs:Command=Render&rs:Format=PDF&sid=5 HTTP/1.1 
Authorization: Negotiate some_long_string 
Host: xyz 

заголовка ответа

HTTP/1.1 403 Forbidden 
Cache-Control: private 
Content-Length: 2925 
Content-Type: text/html; charset=utf-8 
Server: Microsoft-HTTPAPI/2.0 
X-AspNet-Version: 2.0.50727 
Date: Mon, 22 Jun 2015 15:39:29 GMT 

WCF, размещенные с помощью консольного приложения работает идеальный

Запрос Заголовок

GET /ReportServer2008?/ssrswcf/ssrswcftest&rs:Command=Render&rs:Format=PDF&sid=5 HTTP/1.1 
Authorization: Negotiate some_long_string 
Host: xyz 

заголовка ответа

HTTP/1.1 200 OK 
Cache-Control: private 
Content-Length: 25653 
Content-Type: application/pdf 
Expires: Mon, 22 Jun 2015 16:16:42 GMT 
Last-Modified: Mon, 22 Jun 2015 16:17:43 GMT 
Set-Cookie: RSExecutionSession%3a%2fssrswcf%2fssrswcftest=aywu4s45sefnmw45z50bn2vh; path=/ 
Server: Microsoft-HTTPAPI/2.0 
X-AspNet-Version: 2.0.50727 
FileExtension: pdf 
Content-Disposition: attachment; filename="ssrswcftest.pdf" 
Date: Mon, 22 Jun 2015 16:17:42 GMT 
+0

Я сомневаюсь, что это тот же запрос, который выходит ... Используйте Fiddler для перехвата запросов btoh и сравните их. Возможно, Windows Auth. – usr

+0

Спасибо за ответ, я сделаю это и вернусь к вам. – Maddy

+0

Я не уверен, но скрипач не показывает ни одного запроса. FYI, я попытался разместить одну и ту же службу wcf из консольного приложения, тогда она работает правильно, но хост wcf из IIS имеет проблему. – Maddy

ответ

1

Ему просто нужна учетная информация, когда она размещена у IIS. он работал с консоли, потому что это консольное приложение выполняется как администратор.

public class ReportGenerator : IReportGenerator 
    { 
     public void ReportRequest() 
     { 
      try 
      { 
       string URL = "http://localhost/ReportServer2008?/ssrswcf/ssrswcftest"; 
       string Command = "Render"; 
       string Format = "PDF";//"EXCEL" 

       URL = URL + "&rs:Command=" + Command + "&rs:Format=" + Format + "&sid=5"; 

       System.Net.HttpWebRequest Req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(URL); 

       Req.Credentials = new NetworkCredential(@"username", "password"); 
       Req.Method = "GET"; 

       string path = @"C:\ssrswcftest\" + Convert.ToString(Guid.NewGuid()) + @".pdf"; 

       System.Net.WebResponse objResponse = Req.GetResponse(); 
       System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Create); 
       System.IO.Stream stream = objResponse.GetResponseStream(); 

       byte[] buf = new byte[1024]; 
       int len = stream.Read(buf, 0, 1024); 
       while (len > 0) 
       { 
        fs.Write(buf, 0, len); 
        len = stream.Read(buf, 0, 1024); 
       } 
       stream.Close(); 
       fs.Close(); 
      } 
      catch (WebException ex) 
      { 
       // 
      } 
      catch (Exception ex) 
      { 
       // 
      } 
     } 
    } 
1

Authorization: Negotiate indicates that authentication is in use. Возможно, ваша служба WCF не имеет необходимых учетных данных. Спросите у владельца службы, какая проверка подлинности требуется, и настройте ее.

+0

Я разместил эту службу с помощью IIS и консольного приложения. Вызов этой услуги для веб-приложения без проблем. Httprequest для службы wcf имеет проблемы. Кроме того, я использовал эту службу с помощью IIS и консольного приложения. Но только вызов IIS имеет ошибку. – Maddy

+0

Не правда ли, что вызов преуспевает, когда он сделан из консольного приложения и терпит неудачу, когда он сделан из чего-либо, размещенного в IIS? – boot4life

+0

спасибо, что это сработало, я получил ваше мнение. – Maddy