2012-10-18 6 views
5

私はC#でWCFを構築しており、クライアントは同時にそれを消費しています。何らかの理由で、intを返すメソッドを取得するのに問題があります。ここに私の契約は次のとおりです。私は、Visual Studioを使用していWCFがintを返さない

public class MData : IMData 
{ 
    public String HelloWorld() 
    { 
    return "Hello World"; 
    } 

    public int ReturnAnInt() 
    { 
    return 5; 
    } 
} 

、およびクライアントのために、私は、Webリファレンスとして、このWCFをインポート:私はそれを実装しているのはここ

[ServiceContract] 
public interface IMData 
{ 
    [OperationContract] 
    int ReturnAnInt(); 

    [OperationContract] 
    String HelloWorld(); 
} 

です。 MDataのインスタンスを宣言してHelloWorldを呼び出す何らかの理由で、問題はありませんが、ReturnAnIntを呼び出すときにコンパイルエラーが発生します。

MData m = new MData(); 
String helloWorld = m.HelloWorld(); 
int result = m.ReturnAnInt(); 

私はReturnAnIntで取得エラーはありません: Visual Studioが期待しているかを見るためにオーバーそれではIマウス 「メソッドの何過負荷 『ReturnAnInt』 0引数を取り」、そして、それは方法が見えるべきであると述べています以下のように:

void MData.ReturnAnInt(out int ReturnAnIntResult, out bool ReturnAnIntResultSpecified) 

私は今、時間このにわたり壁に頭を強打されているとGoogleで何を見つけることができ、そしてそれは私の同僚は、同様に困惑しています。定義に含まれていないパラメータを2つ追加して戻り値の型を変更したのはなぜですか?どんな助けでも大歓迎です。私が助けになるような情報を残しておけば、お詫び申し上げます。

答えて

4

Web参照(古い技術)ではなく、サービス参照(新しい技術)としてインポートできますか?私はサービスの参照を通じてWCFサービスを扱いましたが、そのような問題は見られませんでした。サービス定義ではintが許可されていない場合、Specifiedプロパティ(そしてと一緒に2つのoutパラメータではなくプロパティとして)指定された(私の経験上、WCF生成のサービス定義は期待どおりに機能していました)。

あなたは、より良い解決策を見つけることができない場合は、ここでpartial classesを使用して回避策はあります:(これはあなたがstructを返す任意の時間に行わなければならないだけでなく、int S)

public partial class MData 
{ 
    public int ReturnAnInt() 
    { 
     int result; 
     bool specified; 
     this.ReturnAnInt(out result, out specified); 
     if (!specified) throw new InvalidOperationException(); 
     return result; 
    } 
} 

更新http://www.codeproject.com/Articles/323097/WCF-ASMX-Interoperability-Removing-the-Annoying-xx WCFが貧弱な(おそらく不正確な)WSDLを生成するという根本的な原因であることを伝えています。実際には不要な要素にはminOccurs="0"という要素があります。 Web Referencesはこれをそのまま読んで、対処しようとしているklunkyコードを生成します。あなたが名前空間で(サービスのリファレンスとしてインポート

[ServiceContract] 
public interface IMData 
{ 
    [OperationContract] 
    MyInt ReturnAnInt(); 

    [OperationContract] 
    String HelloWorld(); 
} 
public class Service1 : IMData 
{ 
    public MyInt ReturnAnInt() 
    { 
     return 4; 
    } 

    public string HelloWorld() 
    { 
     return "Hello World"; 
    } 
} 
+0

WCFは本当に 'out'パラメータをサポートしていますか? – abatishchev

+0

はい、それは本当に質問についてです。この問題で説明されている問題は、WCF C#コードでは 'out'パラメータまたはオプションの' int'sが指定されていませんが、Web参照コードジェネレータがそれを作成する方法です。これは機能します。しかし、 'int ReturnAnInt(out int otherInt);'のようなWCFサービスを定義することができ、それはサービス参照とWeb参照の両方としてアクセスできます。生成されるWSDLは、複数の要素を持つレスポンスオブジェクトなので、他のクライアント言語でも使用できるものを生成する必要があります。 –

+0

ありがとう、あなたの答えは、彼らは非常に有用だった!私はそれをサービスリファレンスとしてインポートし、私の問題は解決しました:) –

2

:メソッドの戻り値の型を変更するとともに

[MessageContract(IsWrapped = false)] 
public class MyInt 
{ 
    [MessageBodyMember] 
    public int Result { get; set; } 

    public static implicit operator MyInt(int i) 
    { 
     return new MyInt { Result = i }; 
    } 

    public static implicit operator int(MyInt m) 
    { 
     return m.Result; 
    } 
} 

:彼の記事に基づいて、あなたの代わりにintのこのタイプを返すことができますMData)代わりにWeb参照。

、以下のコードを使用し、

MDataClient m = new MDataClient(); 
String helloWorld = m.HelloWorld(); 
int result = m.ReturnAnInt(); 

あなたのコード内で間違って何もありません。サービスリファレンスを追加して上記のスニペットを使用するとうまくいくはずです。

0

私も同様の問題がありましたが、私のWebサービスのパラメータout intを動作させることができませんでした。私はまだこれが正確だったために確信が持てませんが、stringoutというパラメータとして使用していました。クライアント側の

s_uId = uId.ToString(); 

:Webサービス側の

[OperationContract] 
LoginStatus GetLogin(string username, string password, out string s_uId); 

int uId; 
string s_uId; 
result = client.GetLogin(username, password, out s_uId); 
Int32.TryParse(s_uId, out uId); 
関連する問題