Signalr: オプションのパラメータ

作成日 2012年04月19日  ·  19コメント  ·  ソース: SignalR/SignalR

私が今日遭遇したマイナーな問題。 サーバーメソッドがオプションのパラメーターを受け入れ、クライアントの呼び出しでオプションのパラメーターが除外されている場合、クライアントはサーバーメソッドの呼び出しに失敗します(エラー:値をnullにすることはできません)。

サーバ:

public void GetAll(long Id, bool DoSomething=false)

クライアント:

myHub.GetAll(12);
Bug

最も参考になるコメント

オプションのパラメータが意図したとおりに機能していないと思います。 パラメータのない呼び出しがあり、パラメータを追加しようとしています。

残念ながら、下位互換性を損なうことなくこれを行う方法はありません。クライアントコードは現在引数なしで呼び出しているため、System.IO.InvalidDataExceptionが発生します。呼び出しは0個の引数を提供しますが、ターゲットは1個の引数を期待します-単一の_nullableオプションパラメーター_がある場合でも。

nullを渡すようにクライアントを変更する必要がある場合、下位互換性を維持できず、オプションのパラメーターをまったく使用しないこともできます😦

回避策:別の名前で新しいメソッドを追加して呼び出します。パラメーターが渡されない場合は、元のメソッドに転送されます。 がっかり👎

全てのコメント19件

メソッドの解決をよりスマートにすることができます。

間違いなく良い考えです。 実際に作業を開始しましたが、その時点で基本的な動的ハブの実装をできるだけ早くプッシュするように戻りました。

メソッド解決といえば...
現在の実装では、メソッドのオーバーロードのサポートを追加することもできます。 名前付きパラメーター解決も追加できますが、これは、パラメーターが実際にクライアントとサーバー間で渡される方法にいくつかの変更を加えることを意味します(値だけでなくキーと値のペアを渡す)。 どう思いますか?

これはNullableパラメータにも当てはまりますか? 3つのパラメーターを持つメソッドがあり、最後のパラメーターはnull許容のint(int?)です。 最後のパラメータをnullに設定すると、例外が発生します。

値をnullにすることはできません。
パラメータ名:o

Newtonsoft.Json.Utilities.ValidationUtils.ArgumentNotNull(Object value、String parameterName)で
Newtonsoft.Json.Linq.JToken.FromObjectInternal(Object o、JsonSerializer jsonSerializer)で
Newtonsoft.Json.Linq.JToken.FromObject(Object o、JsonSerializer jsonSerializer)で
Microsoft.AspNet.SignalR.Client.Hubs.HubProxy.InvokeでT
GeoTag.App.Core.Services.SignalRClientServiceで。d__9.MoveNext()

サーバー上でデフォルト値を設定していないことに注意してください

これをv3候補として新しいリポジトリに移動します

@ JasonBSteele-久しぶりですが、あなたが言及している問題は修正されたばかりです。 次のリリースでそれを見ることを期待してください。

この問題の状況について混乱しています。 SignalRリリースで修正されましたか?

@paulirwin No

..。

修正は7月に出荷された2.2.1にあります(https://github.com/SignalR/SignalR/releases/tag/2.2.1)

私は昨日遭遇したことを再テストしました、ここに私の発見があります:
クライアントが呼び出すハブメソッド

public async Task EpicMethod( int? daysTillNETStandard20 ) {}

.NETクライアントサーバーメソッドの呼び出しの試行:

1. await _serviceRequestHubProxy.Invoke(nameof(ISomethingOnServerSide.EpicMethod), null).ConfigureAwait(false);

System.ArgumentNullException: Value cannot be null.
Parameter name: args
   at Microsoft.AspNet.SignalR.Client.Hubs.HubProxy.Invoke[TResult,TProgress](String method, Action`1 onProgress, Object[] args)
   at Microsoft.AspNet.SignalR.Client.Hubs.HubProxy.Invoke(String method, Object[] args)

2. await _serviceRequestHubProxy.Invoke(nameof(ISomethingOnServerSide.EpicMethod), null, null).ConfigureAwait(false);

System.InvalidOperationException: 'EpicMethod' method could not be resolved. Potential candidates are: 
EpicMethod(daysTillNETStandard20:Nullable`1):Task

3. await _serviceRequestHubProxy.Invoke(nameof(ISomethingOnServerSide.EpicMethod), null, new object[] {}).ConfigureAwait(false);

System.InvalidOperationException: 'EpicMethod' method could not be resolved. Potential candidates are: 
EpicMethod(daysTillNETStandard20:Nullable`1):Task
4. await _serviceRequestHubProxy.Invoke(nameof(ISomethingOnServerSide.EpicMethod), null, new object[] {null}).ConfigureAwait(false);
System.InvalidOperationException: 'EpicMethod' method could not be resolved. Potential candidates are: 
EpicMethod(daysTillNETStandard20:Nullable`1):Task

だから今のところ、ハブメソッドからnull可能性を削除し、クライアント側から0を渡しました

あなたの発見に従って再開します...

私もこの問題を抱えています。 解決されますか?

バインダーがnullNullable<T>変換しないという単純な問題のように聞こえます。 調査します。

したがって、これは実際には仕様によるものであることがわかります。 nullの値を持つオブジェクト配列を実際に渡す方法。 あなたの例を使ってこのように
await _serviceRequestHubProxy.Invoke(nameof(ISomethingOnServerSide.EpicMethod), new object[] {null}).ConfigureAwait(false);

あなたが行っていたのは、パラメータリゾルバが使用していたparams配列を、null値をparams配列に渡すのではなくnullに設定することでした。

この問題は現在のバージョンで解決されるはずですか? 発行日が5年前だったので、オプションのパラメータがまだ機能しませんか?

@ AlameerAshraf-あなたがやろうとしていることを正確に示してください。 現時点では、この分野で何かを変更する予定はないと思います。

オプションのパラメータが意図したとおりに機能していないと思います。 パラメータのない呼び出しがあり、パラメータを追加しようとしています。

残念ながら、下位互換性を損なうことなくこれを行う方法はありません。クライアントコードは現在引数なしで呼び出しているため、System.IO.InvalidDataExceptionが発生します。呼び出しは0個の引数を提供しますが、ターゲットは1個の引数を期待します-単一の_nullableオプションパラメーター_がある場合でも。

nullを渡すようにクライアントを変更する必要がある場合、下位互換性を維持できず、オプションのパラメーターをまったく使用しないこともできます😦

回避策:別の名前で新しいメソッドを追加して呼び出します。パラメーターが渡されない場合は、元のメソッドに転送されます。 がっかり👎

オプションのメソッドパラメーターとオーバーロードをサポートする必要があると本当に思います。SignalRを使用するときに両方を使用するのが一般的であり、直感に反するため、これは実際には遅れている可能性があります。

ここ2020では、メソッドのオーバーロードは機能しますが、オプションのパラメーターは機能しません。とにかく、パラメーター化されていないメソッドからパラメーター化されたメソッドを呼び出し、下位互換性を維持するのは簡単だと思います。

このページは役に立ちましたか?
0 / 5 - 0 評価