WebGet的WCF ResponseFormat
WCF在ServiceContract中的WebGet批注中为ResponseFormat属性提供了两个选项。
[ServiceContract] public interface IService1 { [OperationContract] [WebGet(UriTemplate = "greet/{value}", BodyStyle = WebMessageBodyStyle.Bare)] string GetData(string value); [OperationContract] [WebGet(UriTemplate = "foo", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] string Foo();
ResponseFormat的选项是WebMessageFormat.Json和WebMessageFormat.Xml。 是否可以编写自己的网络消息格式? 我希望当客户端调用foo()方法时,他会获得原始字符串 – 没有json或xml包装器。
WebGetAttribute
由Microsoft提供,我认为您不能扩展WebMessageFormat
。 但是,您可以扩展使用WebGetAttribute
。 您可以添加自己的属性,如
[WebGet2(UriTemplate = "foo", ResponseFormat = WebMessageFormat2.PlainText)] string Foo();
通常,在WCF中自定义消息布局称为自定义消息编码器/编码。 Microsoft提供了一个示例: 自定义消息编码器:压缩编码器 。 人们另外做的另一个常见扩展是扩展行为以添加自定义error handling,因此您可以在该方向上查找一些示例。
尝试使用
BodyStyle = WebMessageBodyStyle.Bare
然后从函数返回System.IO.Stream。
这是我用来从数据库中返回图像的一些代码,但可以通过URL访问:
[OperationContract()] [WebGet(UriTemplate = "Person/{personID}/Image", BodyStyle = WebMessageBodyStyle.Bare)] System.IO.Stream GetImage(string personID);
执行:
public System.IO.Stream GetImage(string personID) { // parse personID, call DB OutgoingWebResponseContext context = WebOperationContext.Current.OutgoingResponse; if (image_not_found_in_DB) { context.StatusCode = System.Net.HttpStatusCode.Redirect; context.Headers.Add(System.Net.HttpResponseHeader.Location, url_of_a_default_image); return null; } // everything is OK, so send image context.Headers.Add(System.Net.HttpResponseHeader.CacheControl, "public"); context.ContentType = "image/jpeg"; context.LastModified = date_image_was_stored_in_database; context.StatusCode = System.Net.HttpStatusCode.OK; return new System.IO.MemoryStream(buffer_containing_jpeg_image_from_database); }
在您的情况下,要返回原始字符串,请将ContentType设置为“text / plain”之类的内容,并将数据作为流返回。 猜测,像这样:
return new System.IO.MemoryStream(ASCIIEncoding.Default.GetBytes(string_to_send));
我实现了这个属性,也许它将来会帮助某人:
[AttributeUsage(AttributeTargets.Method)] public class WebGetText : Attribute, IOperationBehavior { public void Validate(OperationDescription operationDescription) { } public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation) { dispatchOperation.Formatter = new Formatter(dispatchOperation.Formatter); } public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation) { } public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters) { } } public class Formatter : IDispatchMessageFormatter { IDispatchMessageFormatter form; public Formatter (IDispatchMessageFormatter form) { this.form = form; } public void DeserializeRequest(Message message, object[] parameters) { form.DeserializeRequest(message, parameters) } public Message SerializeReply(MessageVersion messageVersion, object[] parameters, object result) { IEnumerable
如果你正在处理HTTP,有一种方法可以实现这一点,它不是很好,但我想我可以提一下。
您可以将方法的返回类型设置为void,并将原始字符串直接输出到响应中。
[OperationContract] [WebGet(UriTemplate = "foo")] void Foo() { HttpContext.Current.Response.Write("bar"); }