2009-08-24 21 views
5

イムラウンドトリップを保存するためにそのコンストラクタにいくつかの引数を取り、Webサービスを作成しようとしているが、私はエラーを取得しておいてください。 CS1729「サービス名」をWebサービスのC#コンストラクタで引数が許可されていませんか?

ときが「1」の引数を取るコンストラクタが含まれていません私はローカルで即座に(サービスと同じプロジェクトで)すべてをうまく動かせるようにしようとしています...何ができますか?

Webサービス:

public class ayyash : System.Web.Services.WebService { 

    private string _myname; 
    public ayyash (string myname) { 


     _myname = myname; 

     //Uncomment the following line if using designed components 
     //InitializeComponent(); 
    } 
} 

消費:

ayyash a = new ayyash("my name is ayyash"); 

出力:

Compiler Error Message: CS1729: 'ayyash' does not contain a constructor that takes '1' arguments 
+0

私はテストしていませんが、WebMethodとして公開されているコンストラクタですか? –

+1

コンストラクタをWebmothodとして公開することはできません – Ayyash

答えて

7

は、サーバー側のコンストラクタが呼び出されません。サーバーサイドオブジェクトが作成されるときに呼び出されます。つまり、Webサービスメソッドが呼び出された場合と呼び出されたときです。

また、Webサービス上にインスタンスメンバーを持つことはできません。コンストラクターでは「名前」を受け入れることはできず、他のメソッドから使​​用することはできません。それぞれのWebサービスメソッドに引数として "name"を送信する必要があります。要するに、メソッド引数またはクッキーを介してWebサービス "状態"をサービスに渡す必要があります(後者を使用するとWCFに移動すると問題が発生します)。

プロキシオブジェクトのメソッドを呼び出すたびに、新しいサーバーサイドオブジェクトが作成され、オブジェクトが破棄される前にそのメソッドが呼び出されるとします。これは厳密には当てはまりませんが(オブジェクトをプールすることはできますが)、Webサービスの設計に役立ちます。

+0

はい、助けとなるでしょうか、ドキュメントや記事を知っていますか?私は答えを探しています:なぜプライベート変数はコンストラクタの中に設定されていると値を保持しますが、Webメソッドに設定されていないと値を保持するのはなぜですか? – Ayyash

+0

このシナリオは奇妙に聞こえるが、プールインスタンスと新しいインスタンスを純粋に偶然受け取っている可能性が高い。 Webサービス(ASMXまたはWCF)のメンバ変数は、依存関係(つまり、リポジトリなど)のみである必要があります。 Webサービスのメンバ変数に状態を格納しようとすると、あなたは苦痛を与えます。 –

2

サービス要求メッセージにdefault constructor will be called when the service host creates an instance in request

デフォルトのコンストラクタを取得して必要なデータを取得してみませんか?パラメータ化されたコンストラクタに委譲できます。私は何を意味

public MyWebService : this(xxx) {} 

は、サービスホストは、常に(デフォルトコンストラクタを介して要求を処理するために、あなたのクラスのインスタンスを作成することであるあなたがそれにパラメータを渡したい場合は、オプションの数を持っている:。

デフォルトのコンストラクタで
  1. それは
  2. は異なるサービスインスタンスの作成メカニズムを使用するように(私はよく分からない)おそらくextend/modify the asp.net request response pipe lineを要求
  3. でデータを渡す必要があるデータを見つけるオフに行く。This link has some further examples.

私はWCFを使用すると、これを簡単に簡単に行うことができます。また、HTTPListener directlyを使用することもできます。

+0

?どのようにデフォルトのコンストラクタに引数を渡すのですか? – Ayyash

+0

デフォルトコンストラクタが必要ない場合は、必要なargumnentsを使用するように変更します。それ以外の場合はコピーして引数を追加します。このコードの最初のアプローチは、Webサービス開発にとって最良のアプローチであるとは考えられていません。 WSDLとスキーマを自分で生成し、それから作業するほうが、優れていても遅くなるかもしれません。 –

+0

私はあなたが理解しているとは思っていない、あるいは何かが欠けているかもしれない、デフォルトのコンストラクタ(デフォルトで)は引数を受け入れないし、何を試しても、クライアントは引数リストを持つコンストラクタを起動しない。 C#.net Webサービスについて – Ayyash

6

クライアントがあなたのWebサービスを "インスタンス化"しているとき、あなたのサービスでコンストラクタを呼び出していません。あなたのサービスを表すローカルプロキシオブジェクトをインスタンス化しています。 .NETによって生成されるプロキシオブジェクトは、デフォルトコンストラクタのみをサポートします。このため、コンパイルエラーが発生します。

ローカルオブジェクトが機能する理由は、実際にWebサービスを呼び出していないということです。ローカルオブジェクトをインスタンス化し、その上でメソッドを呼び出すだけです。

WebMethodに必要なすべてのデータを渡すためのアプローチを変更する必要があると思います。 Webサービスの典型的なアプローチは、要求された操作を実行するために必要なすべてのデータを受け入れるステートレスサービスを持つことです。例えば

:あなたのクライアントプロキシをインスタンス化するとき

[WebMethod] 
public string DoSomething(string name, string otherData) 
{ 
    ayyash yourObject = new ayyash(name); 

    return yourObject.DoIt(otherData); 
} 
+0

実際に私のデフォルトのコンストラクタは(私はビジュアルスタジオを使用しています)呼び出されますが、私はそれを過負荷にすることはできません問題imの直面しているが、私はあなたの思考のように、私はこの "ステートレス"コンセプトに慣れる必要があります... – Ayyash

+0

リクエストを処理するためにサービス側でコンストラクタが呼び出されます。彼はデフォルト以外のコンストラクタを呼びたいと思っています。 –

+0

私はこの記事[http://www.xml.com/pub/a/ws/2003/01/08/randyray.html]に次のように書いています: "ここでは、オーバーロードされた操作がWSDL 1.1(以下の「リソース」セクションのリンクを参照)、WSDL 1.2のドラフト仕様から削除されています。 – Ayyash

関連する問題