WebApi&Odata-适合文件管理吗?

1 c# odata asp.net-web-api

我将项目中的大部分/全部API从“纯” WCF迁移到Odata,并为此使用了OWIN托管的Odata。

我目前坚持使用的一个元素是文件。我有2个区域需要将ZIP文件上传到服务器进行处理。在一种情况下,它附加到实体(称为“存储库”),并且包含不通过Odata公开(只是上载)的二进制内容。另一方面,这是用于未绑定的操作,并且ZIP文件包含将创建/更改许多实体的配置文件。

使用OData可行吗,还是应该为此忽略Odata并使用“手动配置”标准端点?由于公开了元数据,我真的很想将此保留在Odata中。

在任何人发表评论之前-我一直在尝试通过Google查找文档,但是我一直没有得到任何相关的答案。我得到的答案表明这是可能的,但是当我使用WebApi时,所有示例均指向旧的WCF级别API。http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an-odata-v4-endpoint中的文档不会过多细节。它没有显示操作的参数配置所允许的类型,也没有显示如何配置它以通过Web表单(和客户端,因为我需要两者)通过http发布来接受文件。

elb*_*ita 5

这是有关Web API中OData的媒体资源支持的文档的有用链接:https : //blogs.msdn.microsoft.com/mrtechnocal/2013/10/31/media-resource-support-for-odata-in-web -api /

您可以稍微简化链接中建议的实现,但是可以肯定的是,您需要:

  • 创建一个OData媒体资源控制器。它可能比文档中提出的简单。见下文。
  • 创建一个自定义EntityRoutingConvention以正确地路由到将返回ZIP文件的Get方法(如果有这种用例,如果只需要发布它们,则可能不需要自定义路由约定)。

因此,对于控制器,您可以拥有:

public abstract class YourMediaResourceODataController<TEntity, TKey>
    : ODataController where TEntity : class
{
}
Run Code Online (Sandbox Code Playgroud)

然后是真正的控制器:

public class YourController : YourMediaResourceODataController<YourZIPObjectEntity, string>
{
    // This would be the post
    public async Task<IHttpActionResult> Post()
    {
        var stream = await Request.Content.ReadAsStreamAsync();
        // Manage the stream
    }

    // The get (if you want it, you will need to code the custom EntityRoutingConvention).
    [HttpGet]
    public HttpResponseMessage GetMediaResource(string key)
    {
        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);

        var theZIPFile = yourZIPFileService.GetZIPFileByKey(key);
        StreamContent contentResult;
        using(var ms = new MemoryStream(theZIPFile.theByteArray)
        {
            contentResult = new StreamContent(ms);
        }

        result.Content = contentResult;
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

您将需要具有一个YourZIPObjectEntity带有Stream / byte [] / string属性的实体,具体取决于您如何管理二进制文件。(在文档示例中,这是Image类)。对于该实体,您需要指定它在ODataConfig中具有流(请参见文档中的“设置Web API配置”部分)。

我认为这几乎就是全部。

然后,您可以从代码中将您的ZIP文件作为StreamContent发布:

using(var requestContent = new MemoryStream(yourByteArray))
using(var request = new HttpRequestMessage(HttpMethod.POST, yourPOSTUri)
{
    request.Content = new StreamContent(requestContent);
    // Set headers and send the request...
}
Run Code Online (Sandbox Code Playgroud)

我希望这是您正在寻找的解决方案,或者至少是一种解决方案。