8

我目前正在将我的 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?

4

4 回答 4

4

我建议您WebFaultException在 .NET 4.0 中使用。阅读例如“在 .NET 4 中引入 WCF WebHttp 服务”。尝试

throw new WebFaultException<string> ("bad digest", HttpStatusCode.Forbidden);
于 2011-01-13T23:14:45.780 回答
2

好的!这是我发现的。我的代码没有任何问题。.NET 框架 3.5 或 4.0 没有任何问题。

问题是asp.net开发服务器。在调试服务应用程序时,它很可能托管在 asp.net 开发服务器上,它完全忽略了应用程序给出的状态描述。参考这个问题

将赏金授予至少试图帮助我的@Oleg。

于 2011-01-19T17:35:26.377 回答
1

一个潜在的问题是您将 RequestContext 设置为 null:

operationContext.RequestContext.Reply(reply);     
operationContext.RequestContext = null; 

另一种可能是参数“description”没有设置。

您还在客户端检查:

WebOperationContext.Current.IncomingResponse.StatusDescription

另一种可能性是,在调用 returnCode 后这些值是否已被覆盖?

于 2011-01-19T08:32:53.657 回答
1

确保从 Service Method NULL 对象返回...以便状态代码描述在响应标头中可见,它对我有用。

于 2011-03-18T16:10:41.973 回答