我正在尝试在wcf服务中强加自定义错误处理程序fo rest endpoin以在错误时返回未包装的字符串
public void ProvideFault(Exception error,
MessageVersion version,
ref Message fault)
{
fault = CreateError(error.Message);
SetContentType();
}
private static void SetContentType()
{
if (WebOperationContext.Current != null)
{
var response = WebOperationContext.Current.OutgoingResponse;
response.ContentType = "text/plain";
}
}
private static Message CreateError(string message)
{
var fault = Message.CreateMessage(MessageVersion.None, "", message);
return fault;
}
此代码导致响应标题为“ text / plain”,但错误消息仍被序列化为xml
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Bad Request</string>
当我将原始格式添加到创建的消息中时
private static Message CreateError(string message)
{
var fault = Message.CreateMessage(MessageVersion.None, "", message);
fault.Properties.Add(WebBodyFormatMessageProperty.Name, new WebBodyFormatMessageProperty(WebContentFormat.Raw));
return fault;
}
服务停止返回。从wcf返回未包装的字符串错误的方法是什么?有一个内部ystem.ServiceModel.Channels,m.b派生的StringMessage类。我可以以某种方式实例化它吗?
答案 0 :(得分:1)
尝试使用本文介绍的方法:
https://www.codeproject.com/Articles/34632/How-to-Pass-Arbitrary-Data-in-a-Message-Object-usi
private static Message CreateError(string message)
{
var fault = Message.CreateMessage(MessageVersion.None, "", new TextBodyWriter(message));
fault.Properties.Add(WebBodyFormatMessageProperty.Name, new WebBodyFormatMessageProperty(WebContentFormat.Raw));
return fault;
}
// source: https://www.codeproject.com/Articles/34632/How-to-Pass-Arbitrary-Data-in-a-Message-Object-usi
public class TextBodyWriter : BodyWriter
{
byte[] messageBytes;
public TextBodyWriter(string message)
: base(true)
{
this.messageBytes = Encoding.UTF8.GetBytes(message);
}
protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
{
writer.WriteStartElement("Binary");
writer.WriteBase64(this.messageBytes, 0, this.messageBytes.Length);
writer.WriteEndElement();
}
}
答案 1 :(得分:0)
我认为,当前的要求无法实现WCF,WCF是一种基于SOAP的Web服务,它定义了通信期间的传输格式。什么是SOAP?
https://msdn.microsoft.com/en-us/library/ms995800.aspx
WCF客户端与服务器之间的通信是通过绑定建立的,这意味着所有绑定都将请求的格式指定为xml。但是,为了使服务器能够理解通信的含义,消息的主体仍然是SOAP格式。 ,即XML。
您可以定义响应格式以使其看起来像文本,并且我们知道Chrome浏览器默认情况下期望响应格式为application / JSON,如果您将响应格式定义为JSON,则浏览器呈现文本。
但是如果您想返回纯文本字符串,我认为这是不可能的。