2016-09-26 11 views
0

私は認証と呼ばれるメソッドを宣言しました。このメソッドはAuthenticationRequestを入力として受け取ります。これは私の問題が始まるところです。 AuthenicationRequestのユーザー名とパスワードの変数をプライベートに設定しています。そのため、オーバーロードされたコンストラクタを使用してそれらを返すように設定しています。私のクライアントではAuthentication(new AuthenticationRequest("","")を呼び出そうとしています)、オーバーロードされたコンストラクタは認識されません。私はC#WCFサービスを使用しています。私はWebアドレスからクライアントコードを生成するためにVisual Studioを使用しています。 以下、クラスのコピーを投稿します。私はWCFについてたくさん知っているわけではありませんが、私が理解しているところでは、あなたは特定の事柄に必要な[属性]があります。C#SVCサーバーオブジェクトにはパブリックメソッドがあり、クライアントオブジェクトはありません

AuthenticationRequest

using Classes.General; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Web; 

namespace Classes.Authentication 
{ 
    [DataContract] 
    public class AuthenicationRequest : Status 
    { 

     [DataMember] 
     private String Email, Password; 


     public AuthenicationRequest(String Email, String Password) 
     { 
      this.Email = Email; 
      this.Password = Password; 
     } 

     public void doWork() 
     { 

     } 

     public String GetEmail() 
     { 
      return this.Email; 
     } 

     public String GetPassword() 
     { 
      return this.Password; 
     } 
    } 
} 

Authentication.svc.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Text; 
using MySql.Data.MySqlClient; 
using Classes.General; 
using Classes.Users; 
using Classes.Authentication; 

namespace WebApi_Nepp_Studios.Endpoints 
{ 
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Authentication" in code, svc and config file together. 
    // NOTE: In order to launch WCF Test Client for testing this service, please select Authentication.svc or Authenication.svc.cs at the Solution Explorer and start debugging. 
    [ServiceContract] 
    public class Authentication 
    { 
     //Declare the MySQL variable for global databse operations 
     MySqlConnection conn = new MySqlConnection(Properties.Resources.Cs); 
     MySqlCommand cmd; 
     MySqlDataReader reader; 

     [OperationContract] 
     public AuthenicationResponse Authenicate(AuthenicationRequest input) 
     { 
      //Blah blah blah 
     } 
    } 
} 
+0

この回答を見ることをお勧めします。http://stackoverflow.com/questions/6316118/constructor-in-wcf-datacontract-not-reflected-on-client –

+0

申し訳ありませんが私の質問にお答えいただきありがとうございます。私は今でも別の問題に遭遇しました。私のDoWorkメソッドはクライアント側では見られません。 –

+0

ベイリー、私はその質問にも役立つより徹底的な回答をタイプしています。 –

答えて

0

あなたがやりたいことはできません。ただし、クライアントサイドのコードを生成している場合、[DataMember]とマークされたものだけが引き継がれます。

この回答をチェック - >Constructor in WCF DataContract not reflected on Client

これは、あなたがプライベートセッターを使用してはならないことを意味します。私はあなたが作っているものの仕様を認識してないんだけど、一般的には、データコントラクトのすべてのプロパティは次のように宣言する必要があります:あなたはのDataContractを作っているときは、すべてのプロパティがあるため、公開する必要があります

[DataMember] 
string Email { get; set; } 
string Password { get; set; } 

このデータ契約は、外部クライアントがお客様のサービスに電話するために使用されます。 DataContractには、public getterおよびsetterを持つpublicプロパティのほかに何も格納しないでください。

他の質問からは、WCFをどのように使用するかについてはっきりしていないようです。現在、あなたの認証リクエストにdoWork()メソッドがあります。 WCFによって生成されたコードは、そのようなロジックを渡すことはできません。プロパティ定義を渡すことしかできません。ロジックを完了する必要がある場合は、WCFアプリケーションの内部で発生する必要があります。

WCFはWeb APIのように考える必要があります。クライアントはWCFアプリケーションに要求を送信します。この場合は認証要求で、電子メールとパスワードを設定します.WCFアプリケーション内では、 、WCFアプリケーションが応答を送信します。

上記の内容が十分ではなく、私が試してクリアすることができるかどうかを教えてください。

編集:

DoWork()メソッドは、のDataContractの外に移動することができ、代わりに認証のServiceContractの認証()メソッドに入れることが重要です。そのAuthenticate()メソッドは、リクエストが送信されたときに呼び出される実際のメソッドになります。

関連する問題