将字符串返回到自定义对象类型

时间:2012-04-23 07:24:46

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

我正在尝试编写一个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
        }
    }
}

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

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

4 个答案:

答案 0 :(得分:0)

您将无法返回字符串,因为您的返回类型被定义为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; }
}

答案 1 :(得分:0)

这是你想要的吗?

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

虽然听起来你可能想要在CustomerV中使用IsValid中的属性,或类似的东西。在第二种情况下将其设置为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,因此默认情况下它是有效的。

答案 2 :(得分:0)

声明该方法返回Customer_T,其字符串不是其实例。我建议反对它,但如果你真的想创建一个方法来生成一个对象的实例或一个字符串,你可以让它返回objectCustomer_Tstring都是。

更改

public Customer_T CustName(string accountno)

分为:

public object CustName(string accountno)

问题在于,现在该方法的调用者不确定它将导致什么。

答案 3 :(得分:0)

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

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

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