كتابة عميل C# لاستهلاك خدمة ويب Java التي تُرجع مجموعة من الكائنات

StackOverflow https://stackoverflow.com/questions/64833

  •  09-06-2019
  •  | 
  •  

سؤال

أنا أكتب عميل C# الذي يستدعي خدمة ويب مكتوبة بلغة Java (بواسطة شخص آخر).لقد أضفت مرجع ويب إلى عميلي وأنا قادر على استدعاء الطرق في خدمة الويب بشكل جيد.

تم تغيير الخدمة لإرجاع صفيف من الكائنات، ولا يقوم العميل بتحليل رسالة SOAP التي تم إرجاعها بشكل صحيح.

MyResponse[] MyFunc(string p)

class MyResponse
{
    long id;
    string reason;
}

عندما يتصل وكيل C# الذي تم إنشاؤه بخدمة الويب (باستخدام SoapHttpClientProtocol.Invoc)، أتوقع مصفوفة MyResponse[] بطول 1، أي عنصر واحد.ما أحصل عليه بعد استدعاء الاستدعاء هو عنصر بالمعرف=0 والسبب=null، بغض النظر عما ترجعه الخدمة فعليًا.باستخدام أداة استشعار الحزم، أستطيع أن أرى أن الخدمة تُرجع ما يبدو أنه رسالة صابونية مشروعة مع تعيين المعرف والسبب على قيم غير فارغة.

هل هناك بعض الحيل لجعل عميل C# يتصل بخدمة ويب Java التي تُرجع someobject[] ؟سأعمل على الحصول على عرض توضيحي معقم إذا لزم الأمر.

يحرر:هذا مرجع ويب عبر "إضافة مرجع ويب...".مقابل 2005، .NET 3.0.

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

المحلول

لقد مر وقت طويل، ولكن يبدو أنني أتذكر أنني واجهت مشكلة مع الاختلافات الطفيفة في كيفية التعامل مع مساحات الأسماء الافتراضية بين خدمات الويب .Net وJava.

تحقق مرة أخرى من فئة الوكيل c# التي تم إنشاؤها وأي مساحات أسماء معلنة داخلها (خاصة الإعدادات الافتراضية xmlns = "")، مقابل ما تتوقعه خدمة Java.من المحتمل أن تكون هناك اختلافات دقيقة للغاية وسيتعين عليك إعادة إنشائها.

إذا كان الأمر كذلك، فسوف يتعين عليك توفير المزيد من إعلانات مساحة الاسم في سمات c#.

نصائح أخرى

بفضل زيان، لدي حل.

يتضمن wsdl للخدمة خطًا

<import namespace="http://mynamespace.company.com"/>

يحتوي الصابون الذي أرسله العميل إلى الخادم على السمة التالية في جميع عناصر البيانات:

xmlns="http://mynamespace.company.com"

لكن حمولة XML للاستجابة (من الخدمة إلى العميل) فعلت ذلك لا تضمين مساحة الاسم هذه.من خلال التلاعب باستجابة HTTP (التي حصلت عليها باستخدام واير شارك)، لاحظت أن فئة الوكيل .NET التقطت قيم MyResponse بشكل صحيح إذا فرضت سمة xmlns على كل عنصر بيانات تم إرجاعه.

باستثناء تغيير الخدمة، التي لا أتحكم فيها، فإن الحل البديل هو تحرير فئة الوكيل التي تم إنشاؤها بواسطة VS (على سبيل المثال Reference.cs) والبحث عن أسطر مثل هذا:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://mynamespace.company.com")]
public partial class MyResponse {

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

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

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