5

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

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

  [OperationContract]
  String HelloWorld();
}

これが私が実装した場所です:

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

  public int ReturnAnInt()
  {
    return 5;
  }
}

私は Visual Studio を使用しています。クライアント用に、この WCF を Web 参照としてインポートしました。何らかの理由で、MData のインスタンスを宣言して HelloWorld を呼び出そうとすると、問題はありませんが、ReturnAnInt を呼び出すとコンパイル エラーが発生します。

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

ReturnAnInt で発生するエラーは次のとおりです。

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

私は何時間もこの壁に頭をぶつけていましたが、Google では何も見つかりませんでした。同僚も困惑しています。定義にない 2 つの out パラメータを追加し、戻り値の型を変更したのはなぜですか? どんな助けでも大歓迎です。参考になる情報がありましたら、申し訳ありません。

4

3 に答える 3

4

Web 参照 (古い技術) ではなく、サービス参照 (新しい技術) としてインポートできますか? 私はサービス参照を介して WCF サービスを操作していますが、そのような問題は見たことがありません。サービス定義で noを指定できない場合 ( SpecifiedWCF-生成されたサービス定義は、私の経験では期待どおりに機能しています)。intoutint

より良い解決策が見つからない場合は、部分クラスstructを使用した回避策を次に示します: (これは、 sだけでなく、 a を返すたびに実行する必要がありますint)

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 の生成が不十分であることです (おそらくinaccurate) WSDL -minOccurs="0"本当に必要のない on 要素があります。Web References はこれをそのまま読み取り、それに対処するための扱いにくいコードを生成します。彼の記事に基づいて、次の代わりにこの型を返すことができますint:

[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;
    }
}

メソッドの戻り値の型を変更するとともに、次のようにします。

[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";
    }
}
于 2012-10-18T22:38:59.050 に答える
2

MDataWeb 参照ではなく、サービス参照 (名前空間) としてインポートします。

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

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

あなたのコードには何も問題はありません。サービス参照を追加して上記のスニペットを使用すると、正常に動作するはずです。

于 2012-10-19T01:53:09.043 に答える