- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑使用 ASP.NET Web API 编写的 Web 服务来接受任意数量的文件作为“多部分/混合”请求。辅助方法如下所示(假设 _client
是 System.Net.Http.HttpClient
的实例):
public T Post<T>(string requestUri, T value, params Stream[] streams)
{
var requestMessage = new HttpRequestMessage();
var objectContent = requestMessage.CreateContent(
value,
MediaTypeHeaderValue.Parse("application/json"),
new MediaTypeFormatter[] {new JsonMediaTypeFormatter()},
new FormatterSelector());
var content = new MultipartContent();
content.Add(objectContent);
foreach (var stream in streams)
{
var streamContent = new StreamContent(stream);
streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
streamContent.Headers.ContentDisposition =
new ContentDispositionHeaderValue("form-data")
{
Name = "file",
FileName = "mystream.doc"
};
content.Add(streamContent);
}
return _httpClient.PostAsync(requestUri, content)
.ContinueWith(t => t.Result.Content.ReadAsAsync<T>()).Unwrap().Result;
}
ApiController的子类中接受请求的方法的签名如下:
public HttpResponseMessage Post(HttpRequestMessage request)
{
/* parse request using MultipartFormDataStreamProvider */
}
理想情况下,我想这样定义它,其中根据“Content-Disposition” header 的“name”属性从“multipart/mixed”内容中提取联系人、源和目标。
public HttpResponseMessage Post(Contact contact, Stream source, Stream target)
{
// process contact, source and target
}
但是,使用我现有的签名,将数据发布到服务器会导致 InvalidOperationException
并显示以下错误消息:
No 'MediaTypeFormatter' is available to read an object of type 'HttpRequestMessage' with the media type 'multipart/mixed'.
互联网上有许多如何使用 ASP.NET Web API 和 HttpClient 发送和接收文件的示例。但是,我还没有找到任何说明如何处理此问题的方法。
我开始考虑实现自定义 MediaTypeFormatter
并将其注册到全局配置中。然而,虽然在自定义 MediaTypeFormatter
中处理序列化 XML 和 JSON 很容易,但尚不清楚如何处理几乎可以是任何内容的“多部分/混合”请求。
最佳答案
看看这个论坛:http://forums.asp.net/t/1777847.aspx/1?MVC4+Beta+Web+API+and+multipart+form+data
下面是一段代码(由 imran_ku07 发布),可以帮助您实现自定义格式化程序来处理多部分/表单数据:
public class MultiFormDataMediaTypeFormatter : FormUrlEncodedMediaTypeFormatter
{
public MultiFormDataMediaTypeFormatter() : base()
{
this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("multipart/form-data"));
}
protected override bool CanReadType(Type type)
{
return true;
}
protected override bool CanWriteType(Type type)
{
return false;
}
protected override Task<object> OnReadFromStreamAsync(Type type, Stream stream, HttpContentHeaders contentHeaders, FormatterContext formatterContext)
{
var contents = formatterContext.Request.Content.ReadAsMultipartAsync().Result;
return Task.Factory.StartNew<object>(() =>
{
return new MultiFormKeyValueModel(contents);
});
}
class MultiFormKeyValueModel : IKeyValueModel
{
IEnumerable<HttpContent> _contents;
public MultiFormKeyValueModel(IEnumerable<HttpContent> contents)
{
_contents = contents;
}
public IEnumerable<string> Keys
{
get
{
return _contents.Cast<string>();
}
}
public bool TryGetValue(string key, out object value)
{
value = _contents.FirstDispositionNameOrDefault(key).ReadAsStringAsync().Result;
return true;
}
}
}
然后您需要将此格式化程序添加到您的应用程序中。如果进行自托管,您只需添加以下内容即可:
config.Formatters.Insert(0, new MultiFormDataMediaTypeFormatter());
在实例化 HttpSelfHostServer 类之前。
--编辑--
要解析二进制流,您需要另一个格式化程序。这是我在我的一个工作项目中用来解析图像的一个。
class JpegFormatter : MediaTypeFormatter
{
protected override bool CanReadType(Type type)
{
return (type == typeof(Binary));
}
protected override bool CanWriteType(Type type)
{
return false;
}
public JpegFormatter()
{
SupportedMediaTypes.Add(new MediaTypeHeaderValue("image/jpeg"));
SupportedMediaTypes.Add(new MediaTypeHeaderValue("image/jpg"));
SupportedMediaTypes.Add(new MediaTypeHeaderValue("image/png"));
}
protected override Task<object> OnReadFromStreamAsync(Type type, Stream stream, HttpContentHeaders contentHeaders, FormatterContext formatterContext)
{
return Task.Factory.StartNew(() =>
{
byte[] fileBytes = new byte[stream.Length];
stream.Read(fileBytes, 0, (int)fileBytes.Length);
return (object)new Binary(fileBytes);
});
}
protected override Task OnWriteToStreamAsync(Type type, object value, Stream stream, HttpContentHeaders contentHeaders, FormatterContext formatterContext, TransportContext transportContext)
{
throw new NotImplementedException();
}
}
在您的 Controller /操作中,您需要执行以下操作:
public HttpResponseMessage UploadImage(Binary File) {
//do something with your file
}
关于c#-4.0 - 如何正确实现 MediaTypeFormatter 来处理 'multipart/mixed' 类型的请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10036445/
任何调用 npm run升级到 Mix v4.x 后导致 mix 未定义。我在每次运行时都会看到这样的错误: > npm run development > @ development /projec
升级到 Laravel-Mix 6 之前: Laravel-Mix 版本:5.0.9(支持 Webpack 4) NPM 版本:6.14.5 通过这个 laravel 混合版本,我能够通过运行 pac
在 Laravel 5.5 中,我使用 laravel-mix 来编译我的 Assets 。 但是我不清楚:mix.js 之间有什么区别?和 mix.scripts为什么我要使用一个而不是另一个? 最
我有以下 webpack.mix.js: const { mix } = require('laravel-mix'); mix.scripts([ 'resources/assets/js/
目前,我正在寻找在运行 mix 任务时添加 SQL 语句日志记录的方法。例如,mix ecto.rollback 和 mix ecto.migrate 等命令输出信息: ... 13:45:53.01
我知道这个问题已经被问过了,答案总是单独的答案。 但是我看到 Mix.EctoSQL.ensure_started 提到了很多,这似乎是公认的方法。 然而,在 ecto_sql 3.1.2 中,此功能
mix compile ==> gettext could not compile dependency :gettext, "mix compile" failed. You can recompi
我正在使用 Laravel 5.5 ,在 webpack.mix 文件中,mix.styles 函数完美运行,我完美地编译了我的 css 文件,但是mix.scripts 不编译我在文档中找到的 js
如果我有一个mix.exs文件,例如: defmodule Mix.Tasks.My_task do use Mix.Task @shortdoc "Perform my task" de
这是我第一次使用 Laravel Mix、NodeJS 和 NPM。我试图遵循 Laravel 的文档并相信我做得对,但谁知道呢。 我正在尝试将多个 CSS 文件合并为一个。 webpack.mix.
我对系统发育回归模型比较陌生。过去,当我的树中每个物种只有 1 个条目时,我使用了 PGLS。现在我有一个包含总共 9 个物种的数千条记录的数据集,我想运行一个系统发育模型。我阅读了最常见软件包(例如
TLDR; 您是否必须链接 Laravel Mix 方法来维护执行顺序?是否有任何异步方法会阻止使用以下非链接模式,mix.scripts(); mix.js(); mix.sass(); ? 我运行
我想为支持“显示:网格”但不支持 IE/MS Edge 的浏览器提供特定部分的 CSS。你如何混合正面和负面的@support 查询? 你能写“and not”还是有类似的符号?不幸的是,以下方法不起
在生产中,加载我使用的 Assets ,例如: 并期望在编译时看到: 但是我只是看到相对路径: webpack.mix.js: mix .js('resources/assets/js/ap
有人可以向我解释一下 MIX 中的除法(来自 Knuth 的 TAOCP)是如何在字节到字节的基础上工作的吗? rA = |-| . . . .0| rX = |+|1235|0|3|1| 内存位置
我正在尝试使用我从 themeforest 与 Laravel 购买的主题 我已经使用 mix.copy 将我的字体从 node_modules 移动到我的 public 目录,这工作正常。/ 但是,
至少就在两周前,我一直在代理后面使用mix。但是我昨天发现 mix 无法在代理后面工作。混合版本是1.1.1。mix local.hex 运行。但是mix deps.get 出现错误。 $ mix d
我有一个 C++ 程序,我在其中使用递归迭代器遍历我作为参数提供给程序的文件夹。 问题是,当我在路径上调用 .string 时,我在路径中混合了\和/。使用 .generic_string 修复了这个
所以我有一个 JS 文件,我想使用 Laravel mix 进行混合、复制和压缩;我的 webpack.mix.js 文件如下所示: const mix = require('laravel-mix'
我有一个 Elixir 伞形项目。这个项目中的每个应用程序都可以使用 mix escript.build 编译成可执行文件。 我正在尝试从伞项目的根目录运行此命令并收到以下错误 ** (Runtime
我是一名优秀的程序员,十分优秀!