سؤال

وأنا أحاول أن تستهلك خدمة ويب المحدد باستخدام WSDL عن طريق إنشاء وكيل WCF باستخدام svcutil.exe، ولكن يحدد WSDL أن بعض العمليات ديك المعلمات التي اختيارية (minOccurs = "0")، على سبيل المثال:

<xs:element minOccurs="0" maxOccurs="1" name="meetingId" type="xs:int" /> 

ومما يؤسف له أن الوكيل الذي تم إنشاؤه لا يسمح لي لعدم تحديد القيم (المعلمات ليست قيم الفارغة)، وليس هناك أي "المحدد" الحقول كجزء من الدعوة إلى تكليف الوكيل الذي يجب أن ترسل أي قيمة.

هل هناك أي طريقة لاستخدام svcutil لتوليد الوكيل الذي من شأنه أن يسمح لي أن أفعل ذلك؟

و(على الجانب علما، لقد لاحظت من خلال بحثي أن البعض الآخر قادرة على توليد هذه اضافية المجالات "المحدد" بشكل صحيح باستخدام ميزة "إضافة مرجع خدمة"، ولكن لسبب ما البصرية ستوديو لا يبدو أنها تريد أن تولد الوكيل بعد أن إضافة المرجع (أي شيء يحدث بعد ذلك))

WSDL الملف ولدت وكيل

والأوامر المستخدمة: svcutil HTTP: // sas- int.elluminate.com/site/external/adapter/default/v1/webservice.wsdl / الداخلية /n:*،Elluminate.WebService.WebServiceProxy /o:WebServiceProxy.cs /config:App.config / nologo

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

المحلول

واعتقد ان فئة الوكيل العميل التي تم إنشاؤها بواسطة svcutil تمت حقل / خاصية تسمى meetingId من نوع int - أليس كذلك؟ نعم، هذا هو غير قيم الفارغة - ولكن أراهن لديك أيضا منطقية الحقل / خاصية تسمى meetingIdSpecified - فقط إذا تم تعيين هذا true وخدمة تبدو فعلا في ذلك. إذا لم يكن لتعيينها، ثم الخدمة لا ننظر إلى القيمة، لذلك فمن تقريبا كما لو أنه حيث NULL.

وأيضا - لم يتم تحديد هذا المجال لتكون قيم الفارغة في XSD الخاص بك، إما - الذي حددته أن تكون اختيارية. لجعله قيم الفارغة، استخدم بناء الجملة هذا هنا:

<xs:element minOccurs="0" maxOccurs="1" name="meetingId" type="xs:int" 
            nillable="true" />

وانظر "قيم الفارغة" السمة؟ هذا هو واحد تستخدم لصنع حقل nullable حقا - هل يمكن أن يكون الآن إدخال مثل هذا في XML الخاصة بك:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <meetingId xsi:nil="true" />
</root>

ومارك

نصائح أخرى

لا تستخدم SVCUtil إذا كان لا يعمل بالنسبة لك. إذا ليست معقدة خدمة جدا، يمكنك محاولة الكتابة واجهة الخدمة يدويا، واستخدام ChannelFactory <> لخلق وكلاء الخاص بك.

وانها مشكلة لminOccurs = "0" يجب أن تسمح لك لا تنبعث منها قيمة 'meetingId، والوكيل الذي تم إنشاؤه لا تسمح بذلك.

وأنت تستهلك فقط خدمة، لذلك لم يكن لديك السيطرة على اختصار ولا يمكنك إضافة nillable = "الحقيقي" في اختصار من أجل الحصول على "meetingId" اختياري في الوكيل.

إذا توليد الوكيل مع wsdl.exe، وليس svcutil.exe، سيكون لديك حقل إضافي "meetingIdSpecified" التي تسمح لك لاختيار ما إذا كان أو لا تنبعث منها meetingId المجال.

wsdl.exe http:///myservice?wsdl

ولكن مع wsdl.exe سوف تستهلك الخدمة مع خدمة asp.net على شبكة الإنترنت، وليس WCF.

وأعتقد أن الحقل المفقود هو خلل في svcutil.exe (بالنسبة لي 4.0.30319.17929)، لأنه إذا تولد مع الخيار / ملفوفة:

svcutil.exe /wrapped http:///myservice?wsdl

و.. ثم سيكون لديك أيضا الحقل "meetingIdSpecified" ولدت!

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