我目前正在将我的 WCF RESTful 服务从 .NET 3.5(Starter Kit)迁移到 .NET 4。我使用 Visual Studio 2010 中的 WCF Rest 服务模板开始了我的项目。我必须弄清楚如何保留我的授权方案(以前使用 ServiceAuthorizationManager 完成 RequestInterceptor。经过一些工作和研究,我完成了它。但现在我有一个附带问题。我的服务过去常常使用 HTTP 状态代码和简短描述来反馈我的客户任何处理错误。我在我的服务方法的许多地方都使用 WebOperationContext 向客户描述出了什么问题,如下所示:
protected void returnCode(HttpStatusCode code, string description)
{
WebOperationContext ctx = WebOperationContext.Current;
ctx.OutgoingResponse.StatusDescription = description;
ctx.OutgoingResponse.StatusCode = code;
}
但在 WCF 4 中,只有 StatusCode 有效 - StatusDescription 静默失败。我不知道为什么。我唯一的猜测是 WebOperationContext 在这个新的 WCF 4 场景中不起作用,我应该改用 OperationContext,但这也不起作用。在我的扩展 ServiceAuthorizationManager 的自定义类中使用了以下方法,通知客户端由于身份验证摘要格式错误而无法访问请求:
private void GenerateBadDigestMessage(ref OperationContext operationContext)
{
Message reply = Message.CreateMessage(MessageVersion.None, null, null, new DataContractJsonSerializer(typeof(object)));
HttpResponseMessageProperty hrp = new HttpResponseMessageProperty();
hrp.StatusCode = HttpStatusCode.Forbidden;
hrp.StatusDescription = "bad digest";
reply.Properties[HttpResponseMessageProperty.Name] = hrp;
operationContext.RequestContext.Reply(reply);
operationContext.RequestContext = null;
}
即使在此处使用 OperationContext 直接(安装为 WebOperationContext),StatusDescription 也不起作用。
我在这里缺少什么?为什么这么小的东西可以从.NET 3.5 突破到 4?