C# 如果找不到请求的数据,从wcf服务返回什么
我的简单wcf将一些数据作为dto对象(MyDataDto)返回。这个dto当然是使用MyData对象创建的,MyData对象是使用从存储库返回的数据创建的C# 如果找不到请求的数据,从wcf服务返回什么,c#,.net,wcf,C#,.net,Wcf,我的简单wcf将一些数据作为dto对象(MyDataDto)返回。这个dto当然是使用MyData对象创建的,MyData对象是使用从存储库返回的数据创建的 public MyDataDto GetData(string filter) { MyData data = repository.GetData(filter); return new MyDataDto(data); } 若这个数据对象为null(并没有从存储库返回数据),那个么我将得到异常(当然) 问题是:我应该用Ob
public MyDataDto GetData(string filter)
{
MyData data = repository.GetData(filter);
return new MyDataDto(data);
}
若这个数据对象为null(并没有从存储库返回数据),那个么我将得到异常(当然)
问题是:我应该用ObjectNotFoundException
修饰我的OperationContract
方法,并在客户端处理该异常,还是在mydatadt添加新属性到属性为bool IsEmpty的对象,并返回空对象
<>因为我使用WCF服务很新,你认为是更好的实践,或者你建议别的东西。 我们不能使用普通的.net异常来将错误传播到客户端。您可以通过使用类似这样的方式使用自定义异常
[DataContractAttribute]
public class MyDataDtoFault
{
private string report;
public MyDataDtoFault(string message)
{
this.report = message;
}
[DataMemberAttribute]
public string Message
{
get { return this.report; }
set { this.report = value; }
}
}
[OperationContract]
[FaultContract(typeof(MyDataDtoFault))]
public MyDataDto GetData(string filter)
{
MyData data = repository.GetData(filter);
if (data==null)
throw new MyDataDtoFault("No result Was found");
return new MyDataDto(data);
}
或者,默认情况下,您可以使用一个简单的、可序列化的、表示SOAP错误的
但是创建一个属性是空的,这是正确的,但是想要使用该服务的客户端必须知道,这个属性意味着找不到任何结果
就我个人而言,我更喜欢引发一个异常,这是一种更方便的方法我们不能使用普通的.net异常来将错误传播到客户端。您可以通过使用类似这样的方式使用自定义异常
[DataContractAttribute]
public class MyDataDtoFault
{
private string report;
public MyDataDtoFault(string message)
{
this.report = message;
}
[DataMemberAttribute]
public string Message
{
get { return this.report; }
set { this.report = value; }
}
}
[OperationContract]
[FaultContract(typeof(MyDataDtoFault))]
public MyDataDto GetData(string filter)
{
MyData data = repository.GetData(filter);
if (data==null)
throw new MyDataDtoFault("No result Was found");
return new MyDataDto(data);
}
或者,默认情况下,您可以使用一个简单的、可序列化的、表示SOAP错误的
但是创建一个属性是空的,这是正确的,但是想要使用该服务的客户端必须知道,这个属性意味着找不到任何结果
就我个人而言,我更喜欢提出一个异常,这是一种更方便的方法。最好的做法和推荐的方法是,如果您找到了数据,就不要抛出异常,然后让您的程序处理异常。这不仅会产生性能问题,而且是糟糕的逻辑流程。也意味着难以维护和冗长的代码块/意大利面连接
最佳做法是创建一个具有Success属性的类,例如,指示操作是否成功(即没有SQL错误或任何其他异常),然后在此自定义类中以公开属性返回数据。如果没有数据,那么really MyData为null,因此客户端可以检查它是否为null(或者如果集合…请确保项目的计数/长度为0,并实例化为空)。例如
[DataContract]
public sealed Class MyDataResults
{
public MyDataResults()
{
this.Success = false;
this.FailureInformation = string.Empty;
this.Results = new MyData();
}
[DataMember(IsRequired = true)]
public bool Success {get; set;}
[DataMember(IsRequired = true)]
public MyData Results {get; set;}
[DataMember(IsRequired = true)]
public string FailureInformation {get; set;}
}
而是返回MyDataResults
这也意味着你有一个很好的POCO对象要处理,在合同中有更多的意义,“我保证客户会收到这个对象,而不是他们不期望的东西,甚至可能导致合同破裂”
因此,如果服务器端出现异常(例如FileNotFound),请将Success设置为false,将FailureInformation设置为友好消息以返回。
客户端将检查操作是否成功,如果不成功,则显示失败信息。最佳做法和建议的方法是,如果找到数据,则不要抛出异常,然后让程序处理异常。这不仅会产生性能问题,而且是糟糕的逻辑流程。也意味着难以维护和冗长的代码块/意大利面连接
最佳做法是创建一个具有Success属性的类,例如,指示操作是否成功(即没有SQL错误或任何其他异常),然后在此自定义类中以公开属性返回数据。如果没有数据,那么really MyData为null,因此客户端可以检查它是否为null(或者如果集合…请确保项目的计数/长度为0,并实例化为空)。例如
[DataContract]
public sealed Class MyDataResults
{
public MyDataResults()
{
this.Success = false;
this.FailureInformation = string.Empty;
this.Results = new MyData();
}
[DataMember(IsRequired = true)]
public bool Success {get; set;}
[DataMember(IsRequired = true)]
public MyData Results {get; set;}
[DataMember(IsRequired = true)]
public string FailureInformation {get; set;}
}
而是返回MyDataResults
这也意味着你有一个很好的POCO对象要处理,在合同中有更多的意义,“我保证客户会收到这个对象,而不是他们不期望的东西,甚至可能导致合同破裂”
因此,如果服务器端出现异常(例如FileNotFound),请将Success设置为false,将FailureInformation设置为友好消息以返回。
客户端将检查操作是否成功,如果不成功,则显示失败信息。我的做法是,如果操作无法执行要求的操作,则返回错误。但是,接下来需要检查要求操作执行的操作:
公共MyDto GetEntityById(int-id)
已请求此操作返回具有给定ID的实体。如果它不能这样做,则我认为返回错误是合适的
public List GetEntitiesMatchingFilter(字符串过滤器)
要求此操作返回与筛选器匹配的实体列表。如果没有与筛选器匹配的实体,则这不是返回错误的原因。这是一个正常的预期结果
另一方面,如果操作由于连接到数据库失败而无法返回任何实体,那么这就是返回错误的好理由
我的做法是,如果操作无法执行要求的操作,则返回错误。但是,接下来需要检查要求操作执行的操作:
公共MyDto GetEntityById(int-id)
已请求此操作返回具有给定ID的实体。如果它不能这样做,则我认为返回错误是合适的
public List GetEntitiesMatchingFilter(字符串过滤器)
要求此操作返回与筛选器匹配的实体列表。如果没有与筛选器匹配的实体,则这不是返回错误的原因。这是一个正常的预期结果