如何设置"类型" Web API MultiPartContent消息上的参数?

时间:2014-09-07 17:29:54

标签: c# asp.net-web-api content-type multipart

我需要能够将多部分响应的Content-Type值设置为:

Content-Type: multipart/related; type=application/dicom; boundary={MessageBoundary}

这是在国际标准中定义的,所以我别无选择,我看到使用“type = xxx / yyy”是在MultiPart消息中定义“主要”内容类型的标准用法。 / p>

但是......我还没有找到一种方法来使用Web API中优秀的MultipartContent类来生成这个字符串。我试过了:

1)什么都不做 - 希望从内容中的第一项中获取它 - 它不会

2)设置为子类型的一部分 - 例如:

MultipartContent mpc = new MultipartContent("related; type=application/dicom+xml");

这失败,错误“值的格式'multipart / related; type = application / dicom + xml'无效。”

3)明确设置为MediaTypeHeadervalue上的另一个参数:

var mthv = new MediaTypeHeaderValue("multipart/related");
mthv.Parameters.Add(new NameValueHeaderValue("type", "application/dicom+xml"));

这给出了同样的错误: - (

我在这里遗漏了一些明显的东西,或者真的没有办法表明相关的类型吗?

更新

经过一些研究和反编译NameValueHeaderValue类,似乎问题是类型值中的/和+字符 - 因为NameValueHeaderValue的构造函数检查名称和令牌以查看它们的本机和“令牌字符”只有“版本具有相同的长度 - 即它们是否包含任何非令牌字符 - 如果是这种情况则拒绝它们。鉴于类型值的标准值是MIME类型,根据定义,它包含/字符,这似乎是一个过度且不恰当的严格约束。

2 个答案:

答案 0 :(得分:6)

你是正确的,因为问题在于类型值中的/+字符,但是在拒绝输入时.NET并不完全错误(我可能希望这部分内容API设计得更好,但我知道的是什么)。指定MIME的RFC 2045(第5.1节)说,如果参数值包含任何()<>@,;:\"/[]?=,则必须引用它们。 RFC 2387描述了多部分/相关内容类型,它表示参数值通常需要引用,并且它们给出的示例正确引用了从属内容类型值。至于你的具体问题,例如这应该有效:

var mpc = new MultipartContent ("related") ;
var nvv = new NameValueHeaderValue ("type", "\"application/dicom+xml\"") ;
mpc.Headers.ContentType.Parameters.Add (nvv) ;

答案 1 :(得分:1)

我正在努力解决类似问题,这就是诀窍。

对于DICOM STOW-RS服务,似乎DICOM标准当前指定包含"multipart/related; type=application/dicom; boundary={messageBoundary}"的Content-Type标头。这显然是错误的,应该是"multipart/related; type="application/dicom"; boundary={messageBoundary}"

当我使用包含HttpContentMultipartExtensions.IsMimeMultipartContent()的Content-Type类型参数时,我遇到方法type=application/dicom返回false并且HttpContent.Headers值为空的问题。

使用type="application/dicom"使其有效。