【问题标题】:Return a string to a custom object type将字符串返回到自定义对象类型
【发布时间】:2012-04-23 07:24:45
【问题描述】:

我正在尝试编写一个 C# RESTful Web 服务,该服务在将帐号作为参数传递时返回客户名称。

我有一个客户类:

public class Customer_T
{
    public string CustName { get; set; }
}

一个接口类:

[ServiceContract(Namespace = "", Name = "CustomerInfoService")]
public interface CustomerInfo_I
{
    [OperationContract]
    Customer_T CustName(string accountno);
}

*另一个名为 CustomerInfo 的类实现了 CustomerInfo_I 接口:*

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class CustomerInfo : CustomerInfo_I
{
    [WebInvoke(Method = "GET", UriTemplate = "customer/{accountno}", ResponseFormat = WebMessageFormat.Json)]
    public Customer_T CustName(string accountno)
    {
        string custName = "";
        CustNameByAccountNo custdb = new CustNameByAccountNo();
        custName = custdb.getCustName(accountno).ToString();
        if (custName.Equals("") == false)
        {
            return new Customer_T { CustName = custName };
        }
        else
        {
            return null; //This is where I want to change
        }
    }
}

不返回 null,我想返回一个字符串“InvalidAccNo”
我确实尝试过,但它给了我一个错误。

Cannot implicitly convert type 'string' to 'CustomerInfo.Service.Customer_T'

【问题讨论】:

  • 为什么要返回 Customer_T 是要返回字符串吗?
  • Customer_T 具有在该类中定义的 CustName 属性。如果没有返回客户名称,我想显示字符串“InvalidCustAcc”。我不希望将字符串分配给 CustName 属性。

标签: c# .net json web-services rest


【解决方案1】:

您将无法返回字符串,因为您的返回类型定义为Customer_T。您可能要考虑的一个选项是查看 WCF 内部的故障处理,以将故障返回给用户,而不是重新利用单个对象。抛出错误可用于指示指定的帐号无效。

[ServiceContract(Namespace = "", Name = "CustomerInfoService")]
public interface CustomerInfo_I
{
    [OperationContract]
    [FaultContract(typeof(string))]
    Customer_T CustName(string accountno);
}

http://msdn.microsoft.com/en-us/library/ms733721.aspx

此外,您的 Customer 类,您应该使用 DataContract 属性标记该类,并使用 DataMember 标记您的数据成员,以便返回复杂类型。

[DataContract]
public class Customer_T
{
    [DataMember]
    public string CustName { get; set; }
}

【讨论】:

    【解决方案2】:

    这是你想要的吗?

        if (custName.Equals("") == false)
        {
            return new Customer_T { CustName = custName };
        }
        else
        {
            return new Customer_T { CustName = "Invalid Customer Name!" };
        }
    

    虽然听起来您可能想要 IsValid 的 Customer_T 中的属性,或类似的东西。第二种情况设置为false,覆盖Customer_T的ToString:

    public override string ToString()
    {
        return this.IsValid ? this.CusName : "Invalid Customer Name!";
    }
    

    那么你可以这样做:

        if (custName.Equals("") == false)
        {
            return new Customer_T { CustName = custName };
        }
        else
        {
            return new Customer_T { IsValid = false };
        }
    

    只需确保在 Customer_T 构造函数中将 IsValid 设置为 true,因此默认情况下它是有效的。

    【讨论】:

    • 这比以前工作得更好。它现在不是返回 null,而是将 null 返回到 CustName 属性。我想要做的是显示一个字符串“InvalidCustAcc”而不显示 CustName 属性。我希望我在这里很清楚。谢谢:)
    【解决方案3】:

    该方法被声明为返回一个Customer_T,您的字符串不是它的实例。我建议不要这样做,但如果你真的想创建一个产生对象实例或字符串的方法,你可以让它返回objectCustomer_Tstring 都是。

    改变

    public Customer_T CustName(string accountno)
    

    进入:

    public object CustName(string accountno)
    

    这样做的问题是,现在方法的调用者不确定它会导致什么。

    【讨论】:

    • 刚刚尝试过。将类型 Customer_T 更改为 object 不起作用。它现在给了我一个 HTTP/1.1 400 Bad Request
    • 可能您的 Web 服务的使用者希望找到一个导致 Customer_T 的方法,而这种方法现在不再存在。
    • 那么有什么方法可以做这里需要的吗?
    • 你向网络服务发送了什么请求?如果您请求Customer_T 类型的对象,Web 服务将找不到合适的方法来执行。您需要请求object 类型的对象,如果它不是字符串,则将其转换为Customer_T
    【解决方案4】:

    编译器是对的。 在您的界面中,您已声明 CustName 返回一个 Customer_T,但现在您改变了主意,需要一个字符串作为返回值。
    从 Web 服务合同的角度来看,这并不好。

    因此,如果您需要 Customer_T 作为返回值,请不要更改任何内容,如果未找到 custname,则引发异常。替代品是

    • 添加具有适当签名的新方法
    • 以 CustName 返回的方式更改(重大更改)您的合同 一个字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-25
      • 2012-10-10
      • 1970-01-01
      • 2020-11-16
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多