Signalr: معلمات اختيارية

تم إنشاؤها على ١٩ أبريل ٢٠١٢  ·  19تعليقات  ·  مصدر: SignalR/SignalR

مشكلة صغيرة صادفتها اليوم. يفشل العميل في إجراء استدعاء لطريقة الخادم (خطأ: لا يمكن أن تكون القيمة خالية) ، إذا كان أسلوب الخادم يقبل معلمات اختيارية ويستبعد استدعاء العميل المعلمة الاختيارية:

الخادم:

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

عميل:

myHub.GetAll(12);
Bug

التعليق الأكثر فائدة

لا أعتقد أن المعلمات الاختيارية تعمل على النحو المنشود. لدينا مكالمة بدون معلمات ، وأنا أتطلع إلى إضافة معلمة إليها.

لسوء الحظ ، لا توجد طريقة للقيام بذلك دون كسر التوافق مع الإصدارات السابقة ، نظرًا لأن كود العميل الخاص بنا يستدعي حاليًا بدون وسيطات ، أحصل على System.IO.InvalidDataException: يوفر الاستدعاء 0 وسيطة (وسيطات) ولكن الهدف يتوقع 1 - حتى مع وجود معلمة اختيارية واحدة _nullable_.

إذا اضطررت إلى تغيير عميلي لتمرير قيمة خالية ، فلا يمكنني الحفاظ على التوافق مع الإصدارات السابقة ، وقد لا أستخدم المعلمة الاختيارية على الإطلاق 😦

الحل البديل: إضافة طريقة جديدة واستدعائها باسم مختلف ، والتي تعيد التوجيه إلى الطريقة الأصلية إذا لم يتم تمرير أي معلمة. مخيب للآمال 👎

ال 19 كومينتر

يمكننا أن نجعل دقة الأسلوب أكثر ذكاءً.

بالتأكيد فكرة جيدة. بدأت العمل بالفعل على ذلك ، لكنها عادت لدفع تنفيذ المحاور الديناميكية الأساسية في أسرع وقت ممكن في ذلك الوقت.

الحديث عن طريقة حل ...
مع التنفيذ الحالي يمكننا أيضًا إضافة دعم طريقة التحميل الزائد. سيكون من الممكن إضافة حل المعلمات المسماة أيضًا ، لكن هذا قد يتضمن بعض التعديلات على كيفية تمرير المعلمات فعليًا بين العميل والخادم (تمرير أزواج القيمة الرئيسية بدلاً من القيم فقط). ما رأيك؟

هل ينطبق هذا أيضًا على معلمة Nullable؟ لديّ طريقة بها 3 معلمات ، آخرها هو int nullable int (int؟). إذا قمت بتعيين المعلمة الأخيرة على قيمة خالية ، فسأحصل على الاستثناء:

قيمة لا يمكن أن تكون فارغة.
اسم المعلمة: o

في Newtonsoft.Json.Utilities.ValidationUtils.ArgumentNotNull (قيمة الكائن ، اسم معلمة السلسلة)
في 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؟

تضمين التغريدة

...

الإصلاح في 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

حتى الآن قمت بإزالة nullability من طريقة المحور وتمرير 0 من جانب العميل

إعادة الفتح حسب اكتشافك ...

انا أيضا لدي هذه المشكلة. سيتم حلها؟

يبدو وكأنه مسألة بسيطة من الموثق لا يحول null إلى Nullable<T> . سأحقق.

لذلك تبين أن هذا في الواقع عن طريق التصميم. كيف يجب أن تمر بالفعل في مصفوفة كائنات بقيمة خالية. مثل هذا باستخدام مثالك
await _serviceRequestHubProxy.Invoke(nameof(ISomethingOnServerSide.EpicMethod), new object[] {null}).ConfigureAwait(false);

ما كنت تفعله هو تعيين صفيف المعلمات الذي كان يستخدمه محلل المعلمات ليصبح فارغًا بدلاً من تمرير قيمة فارغة إلى مصفوفة معلمات.

هل من المفترض أن تحل المشكلة في الإصدار الحالي؟ منذ أن كان تاريخ الإصدار قبل 5 سنوات ، ولكن ما زالت المعلمات الاختيارية لا تعمل معي؟

AlameerAshraf @ - أظهر بالضبط ما تحاول القيام به. لا أعتقد أن هناك أي خطط لتغيير أي شيء في هذا المجال في هذه المرحلة.

لا أعتقد أن المعلمات الاختيارية تعمل على النحو المنشود. لدينا مكالمة بدون معلمات ، وأنا أتطلع إلى إضافة معلمة إليها.

لسوء الحظ ، لا توجد طريقة للقيام بذلك دون كسر التوافق مع الإصدارات السابقة ، نظرًا لأن كود العميل الخاص بنا يستدعي حاليًا بدون وسيطات ، أحصل على System.IO.InvalidDataException: يوفر الاستدعاء 0 وسيطة (وسيطات) ولكن الهدف يتوقع 1 - حتى مع وجود معلمة اختيارية واحدة _nullable_.

إذا اضطررت إلى تغيير عميلي لتمرير قيمة خالية ، فلا يمكنني الحفاظ على التوافق مع الإصدارات السابقة ، وقد لا أستخدم المعلمة الاختيارية على الإطلاق 😦

الحل البديل: إضافة طريقة جديدة واستدعائها باسم مختلف ، والتي تعيد التوجيه إلى الطريقة الأصلية إذا لم يتم تمرير أي معلمة. مخيب للآمال 👎

أعتقد حقًا أنه يجب دعم معلمات الطريقة الاختيارية والحمل الزائد - قد يكون هذا متأخرًا في الواقع لأنه من الشائع استخدام كلاهما وعدم استخدامهما عند استخدام SignalR.

هنا في عام 2020 ، تعمل طريقة التحميل الزائد ولكن المعلمات الاختيارية لا تعمل ، على أي حال أعتقد أنه لا يزال من السهل استدعاء طريقة parametrized من غير معلمات والحفاظ على التوافق مع الإصدارات السابقة.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات