我将项目中的大部分/全部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发布来接受文件。
这是有关Web API中OData的媒体资源支持的文档的有用链接:https : //blogs.msdn.microsoft.com/mrtechnocal/2013/10/31/media-resource-support-for-odata-in-web -api /
您可以稍微简化链接中建议的实现,但是可以肯定的是,您需要:
因此,对于控制器,您可以拥有:
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)
我希望这是您正在寻找的解决方案,或者至少是一种解决方案。
| 归档时间: |
|
| 查看次数: |
2605 次 |
| 最近记录: |