2009-08-12 4 views
1

は、私は、次のプロパティを保持しているのActionResultクラスを返すWebサービスメソッドのセットを持っている:WCFサービスからオブジェクトプロパティを持つオブジェクトを返す方法

object returnValue 
bool success 
string message 

のreturnValueを使用したWebメソッドに応じて、戻り値の種類を保持するために使用されます。

私がクライアント上に持っている問題は、WebメソッドがreturnValueで内部クラスを返すと、クライアントがその型を認識しないためにキャストできないということです。

私はクラスを公開することができる方法 "問題"が必要です。

例:

Issue ExposeIssueType() 
{ 
    return null; 
} 

しかし、そこに他の方法ではないでしょうか?

+1

このWCFまたはASMXですか?どの.NETバージョン? –

+0

@Morganがこれまでに返品するかどうかを判断する?私は "いいえ"と賭けた。 –

+0

それはWCFと.NET 3.5です。 –

答えて

1

私のコメントに対するあなたの答えを待っている間、私はこれは非常に悪いウェブサービスの設計であることを伝えます。各Webサービス操作は、返されるデータを返します。可能なすべての戻り値を保持できるクラスを作成することに意味はありません。

さらに、Webサービスからエラーを返すために文字列メッセージを使用しないでください。 SOAPプロトコルには、その目的のための「SOAPフォールト」メカニズムがあります。

あなたはWCFを使用しているので、SOAPフォルトを完全にサポートしています。例:サービス契約で

:障害に返されたデータのための

public int Divide(int a, int b) 
{ 
    if (b == 0) 
    { 
     throw new FaultException<GeneralFault>(
      new GeneralFault {Message = "Attempt to divide by zero"}); 
    } 

    return a/b; // Note - operation can focus on its job 
} 

データコントラクト:

object値を持つ
[DataContract] 
public class GeneralFault 
{ 
    [DataMember] 
    public string Message {get;set;} 
} 
+0

すべてのクライアントがSOAPフォルトをサポートしているわけではありません。すなわちフラッシュ。 – Sklivvz

+0

その後、Flashを使用しないでください。 SOAPは標準であり、障害はその標準の一部です。 Flashは欠陥をサポートしないために何が起こる可能性がありますか? –

+0

ActionResultクラスは、Webサービスメソッドで何が問題になったかによって異なるエラーメッセージを返す可能性があるためです。 メソッドが正常に実行された場合にメソッドが期待しているデータ型だけを返すのは可能ですか? –

0

タイプを共有DLLで作成します(シリアライズ可能とマークします)。ワイヤの両側を参照します。

+0

彼は本当に "内部"を意味するのだろうか? –

+0

これはWCFでのみ動作し、SOAを厳密に推奨しません。 –

+0

@Marc:本当ですが、ポスターはWCFサービスだと言っています。私は(おそらく間違って)これが公然と消耗するのではなく内部的なものであると想定していました。 –

0

サービスで

[FaultContract(typeof(GeneralFault))] 
[OperationContract] 
int Divide(int a, int b); 

Webサービスでは決して良いアイデアではありません。あなたはxml(または同様のもの)しか持っていないとき、どのようにチャンスを逃すことができますか?

複数のサブクラスを試してみるかもしれないいくつかのやっかいなトリックがあります。しかし、これが良い考えであるかどうかは分かりません。

0

あなたが思うようにシンプルにシリアライズ可能ではないので、webmethodシグネチャでオブジェクトを使用することはできません。 (!不当な)あなたのwebMethodsの実行、ActionResult<Issue>


はコメントや-1への懸念に対処するために戻って呼び出す必要があり、その後

public class ActionResult<T> 
{ 
    public T returnValue 
    public bool success 
    public string message 
} 

と:何ができることは、ジェネリック型を使用しています。

[WebMethod] 
    public object example() 
    { 
     return new foo 
       { 
        bar = "bar", 
        baz = "baz" 
       }; 
    } 

    public class foo 
    { 
     public string bar { get; set; } 
     public string baz { get; set; } 
    } 

結果:

システム。InvalidOperationException: XML ドキュメントの生成中にエラーが発生しました。 ---> System.InvalidOperationException: タイプのTest + fooが期待されていませんでした。 XmlIncludeまたはSoapInclude 属性を使用して、 が静的​​に認識されない型を指定します。

つまり、返すことができるすべての非プリミティブ型を指定する必要があります。これは、達成しようとしているものとほとんど同じです。

私はシリアル化機能についての私の元の主張を変更しました。

+0

すべてのWebサービス実装がジェネリックをサポートしているわけではありません(おそらくジェネリックリストなどは除きます) –

+0

これは当てはまりません。 'object'を返すことができます。 -1。 –

+0

彼は彼がWCFを使っていると言って編集しました。 –

関連する問題