Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果找不到请求的数据,从wcf服务返回什么_C#_.net_Wcf - Fatal编程技术网

C# 如果找不到请求的数据,从wcf服务返回什么

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

我的简单wcf将一些数据作为dto对象(MyDataDto)返回。这个dto当然是使用MyData对象创建的,MyData对象是使用从存储库返回的数据创建的

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(字符串过滤器)

    要求此操作返回与筛选器匹配的实体列表。如果没有与筛选器匹配的实体,则这不是返回错误的原因。这是一个正常的预期结果