0

開発者の皆様、こんにちは。

現在、Bulk Report Exporter を作成するタスクがあります。私の考えでは、パラメーターのセットごとにループを作成し、HTTPWebRequest と Response を使用してレポートを取得し、それぞれをファイルに保存する必要があります。

Google で公開されている画像の URL を使用してみましたが、100% 動作します。しかし、私の問題は、レポート サーバーからレポートを取得しようとすると、401 Unauthorized 例外が発生することです。

これが私のコードです:

Dim ReportServerURL As String = System.Configuration.ConfigurationManager.AppSettings.Get("reportServerURL")
'Get the needed credentials for opening a connection to the report server.
Dim ReportServerUN As String = System.Configuration.ConfigurationManager.AppSettings.Get("reportServerUN")
Dim ReportServerPW As String = System.Configuration.ConfigurationManager.AppSettings.Get("reportServerPW")
Dim ReportServerDomain As String = System.Configuration.ConfigurationManager.AppSettings.Get("reportServerDomain")
'Get the path to where the reports must be saved.
Dim BTIReportFolderPath As String = Server.MapPath(System.Configuration.ConfigurationManager.AppSettings.Get("bulkReportingFilePath"))
'Create a http request or connecting to the report server.
Dim ReportHTTPRequest As HttpWebRequest = Nothing
'Create a http response to catch the data stream returned from the http request.
Dim ReportHTTPResponse As HttpWebResponse = Nothing
'Create a stream to read the binary data from the http reponse.
Dim ReportStream As Stream = Nothing
Dim ReportFileStream As FileStream = Nothing
'Create an array of bytes to get the binary data from the stream.
Dim ReportBytes As Byte()
Dim ReportBuffer As Integer = 1024
Dim ReportBytesRead As Integer = 0
'Create a webrequest to get the report with all the report parameters included.
ReportHTTPRequest = WebRequest.Create(ReportServerURL & "&UserID=" & UserID & "&InstrumentID=" & InstrumentID & "&AssessmentID=" & AssessmentID & "&OverViewChartURL=" & reportGraphURL & BTIGraphGenerator.SaveBTIGraph(FactorGraph, reportGraphImagePath) & "&NeuroticismChartURL=" & reportGraphURL & BTIGraphGenerator.SaveBTIGraph(NeuroticismGraph, reportGraphImagePath) & "&ExtraversionChartURL=" & reportGraphURL & BTIGraphGenerator.SaveBTIGraph(ExtraversionGraph, reportGraphImagePath) & "&ConscientiousnessChartURL=" & reportGraphURL & BTIGraphGenerator.SaveBTIGraph(ConscientiousnessGraph, reportGraphImagePath) & "&ExperienceChartURL=" & reportGraphURL & BTIGraphGenerator.SaveBTIGraph(ExperienceGraph, reportGraphImagePath) & "&AgreeablenessChartURL=" & reportGraphURL & BTIGraphGenerator.SaveBTIGraph(AgreeablenessGraph, reportGraphImagePath))
'Dim ReportServerCredentials As New CredentialCache()
'ReportServerCredentials.Add(New Uri(ReportServerURL), "Basic", New NetworkCredential(ReportServerUN, ReportServerPW))
'ReportHTTPRequest.PreAuthenticate = True
'ReportHTTPRequest.Credentials = New NetworkCredential(ReportServerUN, ReportServerPW)
'Get the response from the request.
Dim credentials As String = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(ReportServerUN & ":" & ReportServerPW))
ReportHTTPRequest.Headers.Add("Authorization", "Basic" & credentials)
'ReportHTTPRequest.Credentials = New NetworkCredential(ReportServerUN, ReportServerPW, ReportServerDomain)
'Get the response from the request.
Try
    ReportHTTPResponse = ReportHTTPRequest.GetResponse()
    Catch ex As Exception
    ReportHTTPResponse = ReportHTTPRequest.GetResponse()
End Try

'Read the binary stream from the http response.
ReportStream = ReportHTTPResponse.GetResponseStream()
ReportBytes = New Byte(ReportBuffer) {}
ReportBytesRead = ReportStream.Read(ReportBytes, 0, ReportBuffer)
ReportFileStream = New FileStream(NewBTIReportFolder.FullName & "ASiame" & Guid.NewGuid.ToString() & ".pdf", FileMode.Create)
Do While ReportStream.CanRead And ReportBytesRead > 0
    ReportFileStream.Write(ReportBytes, 0, ReportBytesRead)
    ReportBytesRead = ReportStream.Read(ReportBytes, 0, ReportBuffer)
Loop

ReportHTTPResponse.Close()
ReportStream.Close()
ReportFileStream.Close()

コメントアウトされたすべてのビットは、資格情報を渡すために試みたすべての方法です。

私はサーバーの管理者ですが、認証を受けることができません。

助けてくれてありがとう:)

4

1 に答える 1

0

私は答えを見つけました。私が試したすべての時間: ReportHTTPRequest.Credentials = CredenttailCache.DefaultCredentials()

2 番目の問題では、URL の代わりにローカル IP を使用すると完全に機能することがわかりました。URL を使用すると、リクエストをサーバーから外部にルーティングしてから、サーバーに戻そうとすると思います。ローカル IP を使用すると、リクエストが内部に保持され、魔法のように機能します。

于 2015-05-14T09:16:53.073 に答える