gpt4 book ai didi

c# - WCF REST 错误处理 - 不正确的输入

转载 作者:行者123 更新时间:2023-11-30 12:49:48 24 4
gpt4 key购买 nike

总结:

在 WCF REST 服务中,如何使用我自己的自定义错误响应来处理不正确的输入参数?

详细信息:

我在 WCF REST 服务中有以下接口(interface)方法:

[OperationContract]
[WebGet(UriTemplate = "getitem?id={itemId}", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
[FaultContract(typeof(DataModel.Fault))]
DataModel.Item GetItem(int itemId);

在我对 GetItem 方法的实现中,我捕获了任何错误情况(即项目不存在)并创建了一个 WebFaultException。这没有任何问题。

但是,假设调用客户端调用以下 url:

http://myserver.com/itemservice/getitem?id=abc

即无法按照 GetItem 方法的要求将 id 的输入值强制转换为 int

这个调用正确地失败了,因为给定的 id 值不能转换为 int,但是这个失败发生在我的任何代码执行之前,因此我不能根据 FaultContract 返回我的 DataModel.Fault 对象分配给接口(interface)方法。

所以问题是,我如何 Hook 高级错误处理程序来捕获这种类型的错误并随后返回我自己的错误结构而不是 WCF 生成的 HTML 错误:

Request Error The server encountered an error processing the request. See server logs for more details.

作为同一问题的延续,如果客户调用以下命令,我也希望能够做同样的事情:

http://myserver.com/itemservice/gettitem?id=abc

注意 URI 中的拼写错误,gettitem(两个 t)而不是 getitem

最佳答案

使用IErrorHandler 接口(interface)扩展您的服务。

这将允许您为任何异常提供适当的故障。 This post展示了如何将您自己的错误处理程序连接到您的服务行为。

我个人使用单个类来实现所有必要的元素,如下所示:

public class ErrorSavingServiceBahavior : BehaviorExtensionElement, IServiceBehavior, IErrorHandler
{
private string m_sHostName;

public void AddBindingParameters(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
}

public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
{
this.m_sHostName = serviceHostBase.Description.Name;
foreach (ChannelDispatcher chanDisp in serviceHostBase.ChannelDispatchers)
{
if (!chanDisp.ErrorHandlers.Contains(this))
{
chanDisp.ErrorHandlers.Add(this);
}
}
}

public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
{
}

public bool HandleError(Exception error)
{
//my custom code
}

public void ProvideFault(Exception error, System.ServiceModel.Channels.MessageVersion version, ref System.ServiceModel.Channels.Message fault)
{
//my custom code
}

public override Type BehaviorType
{
get { return this.GetType(); }
}

protected override object CreateBehavior()
{
return this;
}
}

和我扩展的 web.config:

<behaviors>
<serviceBehaviors>
<behavior name="BehaviorName">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true" httpHelpPageEnabled="true"/>
<saveExceptions />
</behavior>
</serviceBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add
name="saveExceptions"
type="Namespace.Class, DLLName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
/>
</behaviorExtensions>
</extensions>

关于c# - WCF REST 错误处理 - 不正确的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10723248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com