HTML 表单 POST 到 WCF 服务

Posted

技术标签:

【中文标题】HTML 表单 POST 到 WCF 服务【英文标题】:HTML form POST to WCF service 【发布时间】:2011-09-28 22:06:37 【问题描述】:

无法让 WCF 服务处理 html 表单帖子。我正在创建一个 SVGToPng 服务。该服务接受字符串(SVG 数据)并将其转换为要下载的图像(带有保存文件对话框)。现在所有现有服务都配置为使用 JSON 作为消息类型。这种特殊的方法将是独一无二的,而我需要执行一个老式的表单 POST。

这是服务的接口。

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = UriTemplate.SvgExportPng, BodyStyle = WebMessageBodyStyle.Bare)]
Stream ExportSvgToPng(String svgData);

为了测试,我让服务读取现有图像文件并将其返回(只是为了测试服务)。这是代码。

WebOperationContext.Current.OutgoingResponse.ContentType = "image/png";
WebOperationContext.Current.OutgoingResponse.Headers.Clear();
WebOperationContext.Current.OutgoingResponse.Headers.Add("Content-disposition", "attachment; filename=export-" + DateTime.Now.ToString("MM-dd-yyyy") + ".png");

return File.OpenRead(@"C:\tmp.png");

在我的 javascript 中,我动态创建表单,添加所需的值,发布表单,然后将其从文档中删除。这是javascript。

form.setAttribute("method", "POST");
form.setAttribute("action", Daedalus.Current.WcfUrl + '/svg/png');

hiddenField.setAttribute("name", "svgData");
hiddenField.setAttribute("value", view.trend.getSVG());

form.appendChild(hiddenField);
document.body.appendChild(form);

form.submit();
document.body.removeChild(form);

最后是我在 WCF 日志文件中收到的错误消息。

传入的消息具有意外的消息格式“原始”。该操作的预期消息格式为“Xml”、“Json”。这可能是因为尚未在绑定上配置 WebContentTypeMapper。详情请参阅 WebContentTypeMapper 的文档。

任何帮助都非常感谢,在此先感谢。

【问题讨论】:

【参考方案1】:

您的操作需要一个字符串 - 并且采用某种格式,它可以是 JSON 字符串(内容类型为 applicaiton/json),也可以是包装在 <string> 元素中的 XML(带有序列化命名空间)和内容类型 text/ xml(或应用程序/xml)。问题是表单 POST 正在发送表单/url 编码的数据(内容类型 application/x-www-form-urlencoded)。

WCF 不支持开箱即用的表单 urlencoded,但您可以从 http://wcf.codeplex.com 获得“jQuery 支持”,它有一些支持它的类,或者将输入作为流(如你处理输出)并自己解析表单/urlencoded数据。

【讨论】:

以上是关于HTML 表单 POST 到 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章

身份验证模式=“表单”导致WCF服务中的重定向

HTML表单的POST上传方式

URL传值和form表单提交的区别和原理

使用 HTML 表单发送 RAW 数据 POST 请求?

空表单 POST 数据

HTTP Post 表单