我有一个 WCF REST 项目,它以 WebFaultExceptions 的形式返回 http 状态代码。这对于 GET 调用非常有效,但我在为 POST 调用返回 WebFaultException 时遇到问题。请求正文中的数据使用内容类型为“application/x-www-form-urlencoded;charset=utf-8”。我认为问题在于,当上下文切换出 using 子句以引发 WebFaultException 时,底层请求流已关闭。
如果我在“使用”子句之前抛出 WebFaultException,则会按预期返回异常。如果我从“使用”子句中抛出 WebFaultException,则异常不会返回给客户端。
有没有人对使用流读取器读取请求正文时如何能够成功抛出 WebFaultException 有任何建议?
这是我的服务器端代码的缩写版本。请注意,此示例的 httpstatuscodes 对于我的实际实现是不现实的。
[WebInvoke(Method = "POST"
, UriTemplate = "urls/{id}"
, BodyStyle = WebMessageBodyStyle.WrappedRequest
)]
public string PostItem(string id, object streamdata)
{
int _id = 0;
if (int.TryParse(companyIdSr2, out _id))
{
using (System.IO.StreamReader reader = new System.IO.StreamReader(streamdata))
{
string body = reader.ReadToEnd();
if(string.IsNullOrEmpty(body))
{
// this exception doesn't make it back to the client's request object
ThrowError(HttpStatusCode.BadRequest, "empty body");
}
}
}
else
{
// this exception is successfully returned to the client's request object
ThrowError(HttpStatusCode.BadRequest, "invalid id");
}
}
private static void ThrowError(HttpStatusCode status, string message)
{
request_error error = new request_error
{
request_url = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri.OriginalString,
error_status_code = status.ToString(),
error_message = message,
};
throw new WebFaultException<request_error>(error, status);
}
public class request_error
{
[XmlElement("request_url")]
public string request_url { get; set; }
[XmlElement("error_status_code")]
public string error_status_code { get; set; }
[XmlElement("error_message")]
public string error_message { get; set; }
}
我已经看到了这个问题 - Wrong WebFaultException when using a Stream and close the stream - 虽然它在一定程度上解决了这个问题,但没有回答的是不处置或关闭流是否合理。
非常感谢,
特里