6

次のように、Web サービスの背後にあるフラグ属性の列挙があります。

[Serializable,Flags]
public enum AccessLevels
{
    None = 0,
    Read = 1,
    Write = 2,
    Full = Read | Write
}

私の問題は、Web サービスのコンシューマが列挙型の元の定数値を持っていないことです。結果として得られるプロキシ クラスのクライアント側には、次のようなものがあります。

{
   None = 1,
   Read = 2,
   Write = 4,
   Full = 8
}

したがって、消費者が「読み取り」アクセスをチェックしているとき、これは「testItem」が「Full」であっても false になります。

((testItem & Svc.Read) == Svc.Read)

Web サービスでフラグを適切に提供するにはどうすればよいですか?

編集:

この記事によると、私が探していることを実行できない可能性があります。イヴァン・クリヴィヤコフは次のように述べています

列挙型の不完全な透明性

列挙型は、私たちが望んでいたほど透過的ではないことがわかりました。厄介な問題が 3 つあります。

  1. サーバー側のコードが列挙型を宣言し、特定の数値をそのメンバーに割り当てる場合、これらの値はクライアントには表示されません。
  2. サーバー側のコードが [Flags] 列挙型を「複合」マスク値 (白 = 赤|緑|青のように) で宣言すると、クライアント側に正しく反映されません。
  3. サーバーまたはクライアントが列挙型の範囲外の「不正な」値を送信すると、反対側の XML デシリアライザーで例外が発生します。

だから、これは単なる制限であり、不可能なのだろうか。

4

4 に答える 4

0

1つのオプションは、列挙型の代わりにより詳細なクラスを提供することです。

[Serializable]
public class AccessPermission{
 public boolean None{get;set;}
 public boolean Read{get;set;}
 public boolean Write{get;set;}
 public boolean Full{get;set;}

 public AccessPermission(AccessLevels level){
  None = false;
  Read = false;
  Write = false;
  Full = false;

  switch(level){
  case AccessLevels.None:
   break;
  case AccessLevels.Read:
   Read = true;
   break;
  case AccessLevels.Write:
   Write = true;
   break;
  case AccessLevels.Full:
   Read = true;
   Write = true;
   Full = true;
   break;
  }
 }
} 

私が見ることができる他のオプションは、送信している整数を正常に相互運用するために使用している言語でメソッドを提供することです。フラグ演算子は、個々のフラグがマークされているかどうかを確認するために c# がビット マスキングを行うことを意味します。

0001 -> なし
0010 -> 読み取り
0100 -> 書き込み
0110 -> フル

したがって、許可を確認するには、そのビットが設定されているかどうかを確認する必要があります


public static boolean CanRead(int accessLevel){
 return (accessLevel | 2) > 0 // return true if read bit set, using bitwise or
}

public static boolean CanWrite(int accessLevel){
 return (accessLevel | 4) > 0 // return true of write bit set.
}

この 2 番目のソリューションはより脆弱であることに注意してください。

于 2009-02-03T15:00:19.013 に答える
0

同様の問題があり、別の Web サービスを追加して正しいフラグ値を最初に返すことで回避しました。

その後、それらが比較で使用した値になりました。

最もクリーンなソリューションではないかもしれませんが、機能します。

編集:

私の最初の回答は、値が列挙型ではなく別の Web サービスとして渡されることを示唆していました。

ただし、調べてみると、Web サービス全体で 0,1,2 の列挙が 1,2,4 にマップされる ([Flags] 属性が設定されている場合でも) ことが一般的な問題のようです。

多くの人が提案する解決策は、元の列挙定義を変更し、0 ではなく 1 から開始することです。

于 2009-02-03T00:41:29.967 に答える
0

フラグは 2 の倍数である必要があり、あなたの場合、フラグは (0,1,2,3) です。構造体の定義を次のように変更してみてください。

[Serializable,Flags]
public enum AccessLevels{    
None = 1,    
Read = 2,    
Write = 4,    
Full = Read | Write}

そして、それがよりうまく機能するかどうかを確認してください。

(私は私が自分自身をばかにしていないことを願っています、それは遅く、私はベッドに向かう途中です..)

于 2009-02-03T00:42:15.300 に答える