2016-05-14 113 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

解决:只要使用StreamContent独自一人,没有MultipardFormDataContent包装。代码示例:

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