2016-05-14 9 views
0

大きなファイルを受け取るアプリケーションがあるので、streamパラメータを使用しています。WCFサービス経由で大きなファイルを受信

サービス契約:

[ServiceContract] 
public interface IFile 
{ 
    [OperationContract] 
    [WebInvoke(Method = "POST", UriTemplate = "/Upload?fileName={fileName}&requestType={requestType}", ResponseFormat = WebMessageFormat.Json)] 
    FileMetadata Upload(string fileName, RequestType requestType, Stream stream); 
} 

実装:しかし、ストリームで、私はゴミ情報(ように境界とを)受け取る

public FileMetadata Upload(string fileName, RequestType requestType, Stream stream) 
{ 
    var contract = GetContract(fileName, requestType, stream); 
    ... 
} 

private static FileUploadRequest GetContract(string fileName, RequestType requestType, Stream content) 
{ 
    var ms = new MemoryStream(); 
    content.CopyTo(ms); 
    return new FileUploadRequest 
    { 
     Filename = fileName, 
     RequestType = requestType, 
     Content = ms.ToArray() 
    }; 
} 

、転送さXMLのサンプルは次のとおりです。

--a288ea6c-376a-4c7e-9680-39199e34082c 
Content-Disposition: form-data 

<Doc> ... rest of XML 

ストリーム自体はどのように転送できますか?クライアント側の境界を削除するか、サーバー側の境界を切り捨てるべきですか?このサービスがJSからも使用されるべきであれば、そのような追加情報を埋め込むかどうか分からない。

クライアント側では、このような要求を送信します:

public async Task<FileMetadata> Upload(string fileName, RequestType requestType, Stream stream) 
{ 
    var requestUri = $"Upload?fileName={fileName}&requestType={requestType}"; 
    using (var requestContent = new MultipartFormDataContent()) 
    { 
     requestContent.Add(new StreamContent(stream)); 
     var response = await _client.PostAsync(requestUri, requestContent).ConfigureAwait(false); 
     if (response.IsSuccessStatusCode) 
     { 
      var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); 
      return JsonConvert.DeserializeObject<FileMetadata>(responseContent); 
     } 
    } 
    throw new Exception(); 
} 

それはHttpWebRequestと正常に動作しますが、私はより近代的なapporachを使用したいと思います。私は私が何か間違ったことをやっていると確信している、してくださいアドバイス:解決

public FileMetadata Upload(string fileName, RequestType requestType, Stream stream) 
{ 
    var requestUri = $"Upload?fileName={fileName}&requestType={requestType}"; 
    var request = WebRequest.CreateHttp(new Uri(_client.BaseAddress, requestUri)); 
    request.Method = "POST"; 
    request.AllowWriteStreamBuffering = false; 
    request.ContentLength = stream.Length; 
    using (var requestStream = request.GetRequestStream()) 
    { 
     stream.CopyTo(requestStream); 
    } 
    using (var response = (HttpWebResponse) request.GetResponse()) 
    { 
     if (response.StatusCode != HttpStatusCode.OK) 
     { 
      throw new Exception(); 
     } 
     using (var sr = new StreamReader(response.GetResponseStream())) 
     { 
      return JsonConvert.DeserializeObject<FileMetadata>(sr.ReadToEnd()); 
     } 
    } 
} 

答えて

0

:ちょうどMultipardFormDataContentにラップせずに、一人でStreamContentを使用しています。コードサンプル:

public async Task<FileMetadata> Upload(string fileName, RequestType requestType, Stream stream) 
{ 
    var requestUri = $"Upload?fileName={fileName}&requestType={requestType}"; 
    var response = await _client.PostAsync(requestUri, new StreamContent(stream)).ConfigureAwait(false); 
    if (response.IsSuccessStatusCode) 
    { 
     var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); 
     return JsonConvert.DeserializeObject<FileMetadata>(responseContent); 
    } 
    throw new Exception(); 
} 
関連する問題