我正在尝试编写一个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'
答案 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
,其字符串不是其实例。我建议反对它,但如果你真的想创建一个方法来生成一个对象的实例或一个字符串,你可以让它返回object
。 Customer_T
和string
都是。
更改
public Customer_T CustName(string accountno)
分为:
public object CustName(string accountno)
问题在于,现在该方法的调用者不确定它将导致什么。
答案 3 :(得分:0)
编译器是对的。
在您的界面中,您已声明CustName返回Customer_T,但现在您已经改变主意并需要一个字符串作为返回值。
从网络服务合同的角度来看,这并不好。
因此,如果您需要Customer_T作为返回值,请不要更改任何内容并在未找到custname时抛出异常。替代品是