2012-04-23 70 views
2

我正在嘗試編寫一個C#寧靜的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' 
+0

你爲什麼要返回Customer_T是你想返回一個字符串? – SimpleVar 2012-04-23 07:32:37

+0

Customer_T具有在該類中定義的CustName屬性。如果沒有客戶名稱被返回,我想顯示字符串「InvalidCustAcc」。我不希望將字符串分配給CustName屬性。 – cookiemonsta 2012-04-23 09:35:45

回答

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屬性及與DataMember數據成員的類,以便返回複雜類型。

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

這是你想要的嗎?

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

雖然聽起來好像你可能想在Customer_T的IsValid屬性或類似的東西。 Customer_T它設置爲false在第二種情況,並重寫的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的爲真,那麼它默認是有效的。

+0

這比以前工作得更好。而不是返回null,它現在返回null給CustName屬性。我想要做的是顯示一個字符串「InvalidCustAcc」,而不是顯示CustName屬性。我希望我在這裏很清楚。謝謝:) – cookiemonsta 2012-04-23 09:29:32

0

該方法聲明爲返回Customer_T,該字符串不是實例。我會建議反對它,但如果你真的想要一個方法產生一個對象或一個字符串的實例,你可以讓它返回object。其中Customer_Tstring都是。

變化

public Customer_T CustName(string accountno) 

分爲:

public object CustName(string accountno) 

這樣做的問題是,現在該方法的調用者並不知道肯定會造成什麼。

+0

剛剛試過這個..改變類型* Customer_T *到*對象*沒有工作。它現在給我一個** HTTP/1.1 400錯誤請求** – cookiemonsta 2012-04-23 09:14:36

+0

可能你的web服務的使用者期望找到一個產生'Customer_T'的方法,而這種方法現在不再存在。 – Bazzz 2012-04-23 09:46:26

+0

那麼有沒有什麼可能的方法來做這裏所要求的? – cookiemonsta 2012-04-23 10:06:29

0

編譯器是正確的。 在你的接口中,你已經聲明CustName返回一個Customer_T,但是現在你已經改變了主意並需要一個字符串作爲返回值。
從web服務合同的角度來看,這並不好。

因此,如果您需要Customer_T作爲返回值,請不要更改任何內容,並在未找到custname時引發異常。替代方案是

  • 添加一個新的方法與適當的簽名
  • 變化(重大更改)你的方式,返回的CustName一個 字符串合同。
相關問題