0

我需要在用户单击“上传文件”按钮后从网页的前端将 HttpPostedFileBase 发送到 wcf 服务以进行处理,该服务在服务器上运行。我先在服务合同中使用了HttpPostedFileBase,但是没有用。然后我尝试将 HttpPostedFileBase 放入数据合约中,但它仍然不起作用。我挣扎了两天来解决这个问题。现在是方法:

在服务合同中:

[ServiceContract]
public interface IFileImportWcf
{
    [OperationContract]
    string FileImport(byte[] file);
}

并找到这两种方法将 byte[] 转换为流,反之亦然。

    public byte[] StreamToBytes(Stream stream)
    {
        byte[] bytes = new byte[stream.Length];
        stream.Read(bytes, 0, bytes.Length);
        stream.Seek(0, SeekOrigin.Begin);
        return bytes;
    }
    public Stream BytesToStream(byte[] bytes)
    {
        Stream stream = new MemoryStream(bytes);
        return stream;
    } 

在控制器中:

[HttpPost]
public ActionResult Import(HttpPostedFileBase attachment)
{
    //convert HttpPostedFileBase to bytes[]
    var binReader = new BinaryReader(attachment.InputStream);
    var file = binReader.ReadBytes(attachment.ContentLength);
    //call wcf service
    var wcfClient = new ImportFileWcfClient();
    wcfClient.FileImport(file);
}

我的问题是:将 HttpPostedFileBase 发送到 wcf 服务的更好方法是什么?

4

1 回答 1

1

您需要在此处使用WCF 数据流

正如我从您的问题中了解到的那样,您可以控制您的 WCF 服务合同。

如果您将合同更改为以下内容:

[ServiceContract]
public interface IFileImportWcf
{
    [OperationContract]
    string FileImport(Stream file);
}

然后您将能够在客户端使用它:

[HttpPost]
public ActionResult Import(HttpPostedFileBase attachment)
{
    var wcfClient = new ImportFileWcfClient();
    wcfClient.FileImport(attachment.InputStream);
}

请注意,您需要在配置中启用流式传输

<binding name="ExampleBinding" transferMode="Streamed"/>

(有关详细信息,请参阅上面的链接)

于 2012-12-02T08:30:24.407 回答