2

アカウント番号がパラメーターとして渡されたときに顧客名を返すC#のRESTfulWebサービスを作成しようとしています。

私には顧客クラスがあります:

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

インターフェイスクラス:

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

* CustomerInfo_Iインターフェイスを実装するCustomerInfoと呼ばれる別のクラス:*

[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。検討したいオプションの1つは、単一のオブジェクトを転用するのではなく、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; }
}
于 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などのプロパティが必要なようですが。2番目のケースでは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

コンパイラは正しいです。インターフェイスで、CustName が Customer_T を返すと宣言しましたが、気が変わって戻り値として文字列が必要になりました。
これは、Web サービス契約の観点からは良くありません。

したがって、戻り値として Customer_T が必要な場合は、何も変更せず、custname が見つからない場合は例外をスローします。代替手段は

  • 適切なシグネチャを持つ新しいメソッドを追加します
  • CustName が文字列を返すように契約を変更 (破壊的変更) します。
于 2012-04-23T07:37:25.130 に答える
0

Customer_Tメソッドは、文字列がインスタンスではないを返すように宣言されています。反対することをお勧めしますが、オブジェクトまたは文字列のインスタンスを結果として返すメソッドを本当に作成したい場合は、それを返すことができますobject。どちらもCustomer_Tstringです。

変化する

public Customer_T CustName(string accountno)

の中へ:

public object CustName(string accountno)

これに関する問題は、メソッドの呼び出し元が結果がどうなるかわからないことです。

于 2012-04-23T07:35:15.500 に答える