سؤال

لدي تطبيق WPF في VS 2008 مع بعض مراجع خدمة الويب.لأسباب مختلفة (الحد الأقصى لحجم الرسالة وطرق المصادقة) أحتاج إلى تحديد عدد من الإعدادات يدويًا في app.config الخاص بعميل WPF لربط الخدمة.

لسوء الحظ، هذا يعني أنه عندما أقوم بتحديث مراجع الخدمة في المشروع، ينتهي بنا الأمر إلى حدوث فوضى - ارتباطات ونقاط نهاية متعددة.يقوم Visual Studio بإنشاء روابط ونقاط نهاية جديدة باستخدام لاحقة رقمية (أي "Service1" كنسخة مكررة من "Service")، مما يؤدي إلى تكوين غير صالح حيث قد يكون هناك ربط واحد فقط لكل مرجع خدمة في المشروع.

من السهل تكرار ذلك - ما عليك سوى إنشاء خدمة ويب ASP.Net "Hello World" بسيطة وتطبيق WPF في أحد الحلول، وتغيير maxBufferSize وmaxReceivedMessageSize في ربط app.config ثم تحديث مرجع الخدمة.

في الوقت الحالي، نعمل على حل هذه المشكلة عن طريق التراجع عن الدفع على app.config بعد تحديث المراجع، ولكن لا يسعني إلا أن أعتقد أنه يجب أن تكون هناك طريقة أفضل!

كما أن الإعدادات التي نحتاج إلى تغييرها يدويًا هي:

<security mode="TransportCredentialOnly">
    <transport clientCredentialType="Ntlm" />
</security>

و:

<binding maxBufferSize="655360" maxReceivedMessageSize="655360" />

نحن نستخدم فئة مصنع الخدمة، لذلك إذا كان من الممكن ضبط هذه الإعدادات بطريقة ما برمجيًا، فسيعمل ذلك، على الرغم من أن الخصائص لا يبدو أنها مكشوفة.

هل كانت مفيدة؟

المحلول

قم بإنشاء ملف .Bat الذي يستخدم svcutil، لإنشاء الوكيل، والذي يحتوي على الإعدادات المناسبة لمشروعك.إنه أمر سهل إلى حد ما.يعد النقر فوق ملف Batfile لإنشاء ملفات وكيل جديدة كلما تم تغيير الواجهة أمرًا سهلاً.

يمكن بعد ذلك استخدام الدفعة في الإصدارات التلقائية.ثم تحتاج فقط إلى إعداد app.config (أو web.config) مرة واحدة.نقوم عمومًا بفصل التكوينات المختلفة لبيئات مختلفة، مثل dev وtest prod.

مثال (احترس من فواصل الأسطر):

REM generate meta data
call "SVCUTIL.EXE" /t:metadata "MyProject.dll" /reference:"MyReference.dll"

REM making sure the file is writable
attrib -r "MyServiceProxy.cs"

REM create new proxy file
call "SVCUTIL.EXE" /t:code *.wsdl *.xsd /serializable /serializer:Auto /collectionType:System.Collections.Generic.List`1  /out:"MyServiceProxy.cs" /namespace:*,MY.Name.Space /reference:"MyReference.dll" 

:)

//دبليو

نصائح أخرى

بدلاً من تغيير نقطة النهاية التي تم إنشاؤها، يمكنك إضافة نقطة نهاية ثانية وتعريف ربط مع التكوين الذي تحتاجه، ثم في التعليمات البرمجية الخاصة بك فقط ضع اسم نقطة النهاية الجديدة في مُنشئ عميل الخدمة الخاص بك.

بطريقة ما أفضل استخدام svcutil.exe مباشرةً بدلاً من استخدام ميزة "إضافة مرجع الخدمة" في Visual Studio:P. هذا ما نفعله في مشاريع WCF الخاصة بنا.

أتفهم وجهة نظرك، svcutil هي بالتأكيد الطريقة الأكثر تقدمًا لإضافة مراجع الخدمة وتحديثها.إنه مجرد عمل يدوي أكثر قليلاً عندما يكون "النقر بزر الماوس الأيمن، مرجع التحديث" قريبًا جدًا من العمل في خطوة واحدة فقط.

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

شكرا على النصيحة في أي حال.

ما نفعله هو أننا نفحص (من التحكم بالمصادر) ملفات app.config و*.cs التي تم إنشاؤها تلقائيًا بواسطة الأداة المساعدة svcutil.exe، ثم نقوم بتشغيل ملف دفعي يقوم بتشغيل svcutil.exe لاسترداد بيانات تعريف الخدمة.عند الانتهاء، نعيد ترجمة الكود، ونتأكد من أنه يعمل، ثم نتحقق من ملفات app.config و*.cs المحدثة مرة أخرى.إنها أكثر موثوقية بكثير من استخدام "إضافة مرجع الخدمة" الذي غالبًا ما يكون به أخطاء مع Visual Studio.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top