0

我正在尝试通过 ClientAPI 获取 sensenet 上存在的文件流。但我没有找到任何关于此的文档。我也尝试使用 RestCaller SenseNET API 调用,但我不知道如何通过文件路径获取输入参数 FieldID...(例如:/Root/Sites/Test/file.txt)

我有一个服务器 api,它封装了来自客户端应用程序的 sensenet 内容。所以,sensenet 上的请求都在服务器端。我试图用 contentId 获取流文件......但它没有带来 Content.Result 的 ID(带来 ID 的对象(我猜......))。例如,回报是:

内容 = Id = 1016,状态 = WaitingForActivation,方法 =“{null}”,结果 =“{尚未计算}”

这是我的代码:

var fileId = SenseNet.Client.Content.LoadAsync(parentPath).Result.Id;
        var req = RESTCaller.GetStreamRequest(fileId);

        try
        {
            using (var response = await req.GetResponseAsync())
            {
                using (var stream = response.GetResponseStream())
                {
                    using (var streamReader = new MemoryStream())
                    {
                        stream.CopyTo(streamReader);
                        return streamReader.ToArray();
                    }
                }
            }
        }
        catch (WebException webex)
        {
            throw await RESTCaller.GetClientExceptionAsync(webex, req.RequestUri.ToString());
        }
4

3 回答 3

1

一个类似的例子,完全异步。如果可能,请不要将异步 API 调用转换为同步调用。即使在 ASP.NET 环境中,也应该可以将方法设计为异步,而不是强制它们同步运行。

下面的例子是一个异步 MVC 控制器方法。它首先获取文件 id(当然,如果你已经有文件 id,你可以跳过它),然后下载流并立即将字节写入输出流

public async Task DownloadAsync()
{
    var path = "/Root/YourDocuments/test1.txt";
    var fileContent = await SNC.Content.LoadAsync(path);
    var fileId = fileContent.Id;
    var req = SNC.RESTCaller.GetStreamRequest(fileId);

    Response.ClearContent();
    Response.AddHeader("content-disposition", $"attachment;filename={fileContent.Name}");
    Response.ContentType = "text/plain";
    Response.ContentEncoding = Encoding.UTF32;

    using (var response = await req.GetResponseAsync())
    {
        using (var stream = response.GetResponseStream())
        {
            await stream.CopyToAsync(Response.OutputStream);
        }
    }

    Response.End();
}

如果您不使用 MVC,您也可以在HttpTaskAsyncHandler或异步 ASP.NET 页面上执行相同的操作。如果您希望我们提供更详细的示例,请让我们更多地了解您的环境和业务案例。

于 2017-02-11T16:26:59.847 回答
0

为了解决我的具体问题,我必须创建直接返回它的任务。

return Task.Factory.StartNew(() =>
        {

            using (var content = Content.LoadAsync(path))
            {
                var fileId = content.Result.Id;
                var req = RESTCaller.GetStreamRequest(fileId);

                using (var response = req.GetResponse())
                {
                    using (var stream = response.GetResponseStream())
                    {
                        using (var streamReader = new MemoryStream())
                        {
                            stream.CopyTo(streamReader);
                            return streamReader.ToArray();
                        }
                    }
                }
            }
        }).WaitAndUnwrapException();
于 2017-02-09T11:49:26.553 回答
-1

我假设您指的是 FieldID 的 fileId。您要下载的文件通常从 UI 上的列表中选择。我可以推荐的最佳选择是您应该获取文件的 ID 以及用于在列表中显示的其他属性。然后,您只需从现在具有 Id 的列表中获取所选文件。我希望,我帮助...

于 2017-02-03T10:38:44.997 回答