【问题标题】:Receive large files via WCF service通过 WCF 服务接收大文件
【发布时间】:2016-05-14 11:30:47
【问题描述】:

我有一个应该接收大文件的应用程序,这就是我使用stream 参数的原因。

服务合同:

[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,但我想使用更现代的方法。我确定我做错了什么,请指教:

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

【问题讨论】:

    标签: c# .net wcf rest dotnet-httpclient


    【解决方案1】:

    已解决:只使用 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();
    }
    

    【讨论】:

      猜你喜欢
      • 2012-03-30
      • 2018-12-04
      • 2017-04-22
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 2019-05-25
      相关资源
      最近更新 更多