Signalr: Parameter Opsional

Dibuat pada 19 Apr 2012  ·  19Komentar  ·  Sumber: SignalR/SignalR

Masalah kecil yang saya temui hari ini. Klien gagal melakukan panggilan ke metode server (kesalahan: Nilai tidak boleh null), jika metode server menerima parameter opsional dan panggilan klien mengecualikan parameter opsional:

Server:

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

Klien:

myHub.GetAll(12);
Bug

Komentar yang paling membantu

Saya tidak berpikir parameter opsional berfungsi sebagaimana mestinya. Kami memiliki panggilan tanpa parameter, yang ingin saya tambahkan parameter.

Sayangnya tidak ada cara untuk melakukan ini tanpa merusak kompatibilitas mundur, karena kode klien kami saat ini memanggil tanpa argumen, saya mendapatkan System.IO.InvalidDataException: Invocation menyediakan 0 argumen tetapi target mengharapkan 1 - bahkan dengan satu parameter opsional _nullable_.

Jika saya harus mengubah klien saya untuk memberikan null, maka saya tidak dapat mempertahankan kompatibilitas mundur, dan mungkin juga tidak menggunakan parameter opsional sama sekali 😦

Solusi: Tambahkan dan panggil metode baru dengan nama berbeda, yang meneruskan kembali ke yang asli jika tidak ada parameter yang diteruskan. Mengecewakan 👎

Semua 19 komentar

Kita bisa membuat resolusi metode lebih pintar.

Ide yang bagus. Mulai benar-benar mengerjakan itu, tetapi kembali untuk mendorong implementasi hub dinamis dasar secepatnya pada saat itu.

Berbicara tentang metode penyelesaian ...
Dengan implementasi saat ini kami juga dapat menambahkan dukungan metode overloads. Penyelesaian parameter bernama juga dapat ditambahkan, tetapi itu akan menyiratkan beberapa modifikasi pada bagaimana parameter sebenarnya diteruskan antara klien dan server (meneruskan pasangan kunci-nilai, bukan hanya nilai). Apa yang kamu pikirkan?

Apakah ini juga berlaku untuk parameter Nullable? Saya memiliki metode dengan 3 parameter, yang terakhir adalah int nullable (int?). Jika saya menetapkan parameter terakhir ke nol, saya mendapatkan pengecualian:

Nilai tidak boleh nol.
Nama parameter: o

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

Perhatikan bahwa saya belum menetapkan nilai default untuk itu di server

Kami akan memindahkan ini ke repo baru sebagai kandidat v3

@JasonBSteele - Saya tahu sudah lama, tetapi masalah yang Anda sebutkan baru saja diperbaiki. Berharap untuk melihatnya di rilis berikutnya.

Saya bingung dengan status masalah ini. Apakah sudah diperbaiki dalam rilis SignalR?

@paulirwin No

...

Perbaikan ada di 2.2.1 yang dikirimkan pada bulan Juli (https://github.com/SignalR/SignalR/releases/tag/2.2.1)

Saya menguji ulang apa yang saya hadapi kemarin, berikut adalah temuan saya:
Metode hub yang akan dipanggil klien

public async Task EpicMethod( int? daysTillNETStandard20 ) {}

Upaya pemanggilan metode server klien .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

jadi untuk saat ini saya menghapus nullability dari metode hub dan meneruskan 0 dari sisi klien

Membuka kembali sesuai temuan Anda ...

Saya punya masalah ini juga. Akan diselesaikan?

Kedengarannya seperti masalah sederhana binder tidak mengubah null menjadi Nullable<T> . Saya akan menyelidiki.

Jadi ternyata ini sebenarnya adalah desain. Bagaimana Anda seharusnya mengirimkan array objek dengan nilai null. Seperti ini menggunakan contoh Anda
await _serviceRequestHubProxy.Invoke(nameof(ISomethingOnServerSide.EpicMethod), new object[] {null}).ConfigureAwait(false);

Apa yang Anda lakukan adalah menyetel array params yang digunakan oleh parameter resolver ke null alih-alih meneruskan nilai null ke dalam array params.

Apakah masalah seharusnya diselesaikan dalam versi saat ini? Karena tanggal Penerbitan adalah 5 tahun yang lalu, Tetapi parameter Opsional masih tidak berfungsi untuk saya?

@AlameerAshraf - tunjukkan dengan tepat apa yang Anda coba lakukan. Saya tidak berpikir ada rencana untuk mengubah apa pun di area ini pada saat ini.

Saya tidak berpikir parameter opsional berfungsi sebagaimana mestinya. Kami memiliki panggilan tanpa parameter, yang ingin saya tambahkan parameter.

Sayangnya tidak ada cara untuk melakukan ini tanpa merusak kompatibilitas mundur, karena kode klien kami saat ini memanggil tanpa argumen, saya mendapatkan System.IO.InvalidDataException: Invocation menyediakan 0 argumen tetapi target mengharapkan 1 - bahkan dengan satu parameter opsional _nullable_.

Jika saya harus mengubah klien saya untuk memberikan null, maka saya tidak dapat mempertahankan kompatibilitas mundur, dan mungkin juga tidak menggunakan parameter opsional sama sekali 😦

Solusi: Tambahkan dan panggil metode baru dengan nama berbeda, yang meneruskan kembali ke yang asli jika tidak ada parameter yang diteruskan. Mengecewakan 👎

Saya benar-benar berpikir bahwa parameter metode opsional dan overloading harus didukung - ini mungkin sebenarnya terlambat karena itu umum untuk menggunakan keduanya dan kontra-intuitif untuk tidak menggunakannya saat menggunakan SignalR.

Di sini, pada tahun 2020 metode overloading berfungsi tetapi parameter opsional tidak, bagaimanapun saya pikir masih mudah untuk memanggil metode parametrized dari non parametrized dan menjaga kompatibilitas ke belakang.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat