2011-10-18 13 views
0

いくつかの問題にぶつかりつつ、安心なwcfサービスからファイルのダウンロードを開始する必要があります。安らかなWCFコールからダウンロード可能なファイルを提供する

私は静かな呼び出しをGETとして設定します(GET呼び出しは、パラメータが削除され、名前が変更されたものと同じです)、ブラウザをポイントして、正しい応答を返します。私のブラウザは私にファイルのダウンロードを促しますが、ファイルが受信されるとそれは空で、ヘッダーのコンテンツ長は0になります。

私がPOSTとして設定し、それをJQueryを使ってajax呼び出しとして呼び出すと、これはサービスにデータを渡す必要があるため、最終結果です。必要に応じてデータポイントをURLとGETを使用してください)。

私の質問:私は私のコンテンツを引き起こすwebHttpBinding(以下コード)を超えるストリームを返すために何かが欠けて

  1. アムは実際に返されないように?

  2. jqueryで受け取ったajaxレスポンスを、ブラウザがダウンロード可能なコンテンツタイプを認識する方法でリダイレクトすることはできますか?これはGETを使用する必要がありますか?

サービスコード:

[WebInvoke(Method = "POST", UriTemplate = "UtilizationReport", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json)] 
     public Stream DownloadUtilizationReport(string startDate, string endDate) 
     { 
       DateTime start = DateTime.Parse(startDate); 
       DateTime end = DateTime.Parse(endDate); 
       . 
       .  
       . 

       Stream stream = reportGenerator.GenerateUtilizationReport(exams); 

       WebOperationContext.Current.OutgoingResponse.ContentType = "text/csv"; 
       WebOperationContext.Current.OutgoingResponse.Headers.Add("Content-Disposition", "attachment; filename=MediaImport_Utilization_" + startDate + "-" + endDate + ".csv"); 
       return stream; 


     } 

エンドポイントの設定:POSTから受信

<system.serviceModel> 
    <bindings> 
     <webHttpBinding> 
     <binding name="reportDownload" transferMode="StreamedResponse" /> 
     </webHttpBinding> 
    </bindings> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="webHttpBehavior"> 
      <webHttp faultExceptionEnabled="true" /> 
     </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name=""> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services>   
     <service name="Poiesis.MediaImport.ReportingService"> 
     <endpoint address="rest" binding="webHttpBinding" bindingConfiguration="reportDownload" behaviorConfiguration="webHttpBehavior" 
      name="restEndpoint" contract="Poiesis.MediaImport.IReportingService" /> 
     </service> 
    </services> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
     multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 

応答:

HTTP/1.1 200 OK 
Cache-Control: private 
Content-Type: text/csv 
Server: Microsoft-IIS/7.5 
Content-Disposition: attachment; filename=MediaImport_Performance2000-01-01-2012-01-01.csv 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Tue, 18 Oct 2011 15:32:47 GMT 
Content-Length: 0 
+0

運がまだありませんか?私は同じことをやろうとしていますが、CreateStreamResponseではなくCreateTextResponseに変更しなければなりませんでした。 –

+0

いいえ、私はそれがリダイレクトのためのASPページを投げてダウンロード用のファイルを提供してしまったので、私は私が望むよりも少し頑丈だが、それは問題を解決した。 – JMorgan

答えて

3

あなたがサービス呼び出しをステップ実行していると、してくださいストリーム内の位置が設定されていることを確認する0にする。 GenerateUtilizationReportメソッドがストリームに書き込みを行っていて、開始するストリームの位置をリセットしていない場合、WCFがストリームの読み込みを開始すると、それ以外のものは見つかりません。これがMemoryStreamの場合は、返す前にPositionプロパティを0に設定するだけです。

+1

私はすでにそれを試みましたが、stream.Seek(0,0)で、私はちょうど0にも位置を設定しようとしました。どちらにも影響はありません。 – JMorgan

+0

try stream.Position = 0; stream.Flush(); –

0

これをGETリクエストにして、サービスurlにwindow.locationを設定します。これによりブラウザが「トリック」され、ダウンロードが開始されます。

関連する問題