2

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

4 回答 4

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

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

[DataContract]
public class Customer_T
{
    [DataMember]
    public string CustName { get; set; }
}
于 2012-04-23T07:33:07.570 回答
0

这是你想要的吗?

    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,因此默认情况下它是有效的。

于 2012-04-23T07:33:16.167 回答
0

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

改变

public Customer_T CustName(string accountno)

进入:

public object CustName(string accountno)

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

于 2012-04-23T07:35:15.500 回答
0

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

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

  • 添加具有适当签名的新方法
  • 以 CustName 返回字符串的方式更改(重大更改)您的合同。
于 2012-04-23T07:37:25.130 回答