تختلف مساحة الاسم المرجعية لخدمة WCF عن الأصل
-
05-07-2019 - |
سؤال
أواجه مشكلة فيما يتعلق بمساحات الأسماء التي تستخدمها مراجع خدمتي. لدي عدد من خدمات WCF ، على سبيل المثال مع مساحة الاسم MyCompany.Services.MyProduct
(مساحات الأسماء الفعلية أطول).
كجزء من المنتج ، أقوم أيضًا بتقديم عينة من موقع C# .NET. يستخدم تطبيق الويب هذا مساحة الاسم MyCompany.MyProduct
.
أثناء التطوير الأولي ، تمت إضافة الخدمة كمرجع للمشروع إلى موقع الويب وتستخدم مباشرة. لقد استخدمت نمط المصنع الذي يعيد مثيل كائن ينفذ MyCompany.Services.MyProduct.IMyService
. حتى الان جيدة جدا.
الآن أريد تغيير هذا لاستخدام مرجع الخدمة الفعلي. بعد إضافة المرجع والكتابة MyCompany.Services.MyProduct
في مربع نص مساحة الاسم ، يقوم بإنشاء فئات في مساحة الاسم MyCompany.myproduct.mycompany.services.myproduct. سيئ! لا أريد أن أتغير using
التوجيهات في عدة أماكن لمجرد أنني أستخدم فئة وكيل. لذلك حاولت إعداد مساحة الاسم مع global::
, ، لكن هذا غير مقبول.
لاحظ أنني لم أحذف حتى مراجع التجميع الأصلية حتى الآن ، وتم تمكين "أنواع إعادة الاستخدام" ، ولكن لم يتم إعادة استخدام أي إعادة استخدام ، على ما يبدو. ومع ذلك ، لا أريد الاحتفاظ بمراجع التجميع في موقع الويب الخاص بي للعمل على أي حال.
الحل الوحيد الذي توصلت إليه حتى الآن هو تعيين مساحة الاسم الافتراضية لتطبيق الويب الخاص بي MyCompany
(لأنه لا يمكن أن يكون فارغًا) ، وإضافة مرجع الخدمة كـ Services.MyProduct
. لنفترض أن العميل يريد استخدام عينة موقع الويب الخاص بي كنقطة انطلاق ، ويغيرون مساحة الاسم الافتراضية إلى OtherCompany.Whatever
, ، من الواضح أن هذا سوف يكسر الحل.
هل هناك حل جيد لهذه المشكلة؟
كي تختصر: أريد إنشاء وكيل مرجعي للخدمة في مساحة الاسم الأصلية ، دون الرجوع إلى التجميع.
ملاحظة: لقد رأيت هذا السؤال, ، ولكن لم يكن هناك حل مقدم مقبول لحالة الاستخدام الخاصة بي.
تحرير: كما اقترح جون سوندرز ، لقد قدمت بعض الملاحظات إلى Microsoft حول هذا:
Itemoun @ Microsoft Connect
المحلول
لقد أضفت أ كتابة هذا الحل إلى مدونتي. نفس المعلومات حقًا ، ولكن ربما أقل تجزئة قليلاً
لقد وجدت بديلاً لاستخدام svcutil.exe
لإنجاز ما أريد. (IMO) يجعل تحديث مرجع الخدمة أسهل من إعادة تشغيل الأداة.
يجب عليك تحديد مساحة اسم المساحة الخاصة بمساحة الاسم على ServiceContract و DataContracts (انظر المزيد أدناه للتعليق).
[ServiceContract(Namespace = "http://company.com/MyCompany.Services.MyProduct")]
public interface IService
{
[OperationContract]
CompositeType GetData();
}
[DataContract(Namespace = "http://company.com/MyCompany.Services.MyProduct")]
public class CompositeType
{
// Whatever
}
يمكن أن تكون مساحة الاسم أي شيء ، ولكن من الناحية الفنية يجب أن تكون URI صالحة ، لذلك اخترت هذا المخطط. قد تضطر إلى البناء يدويًا حتى تعمل الأشياء لاحقًا ، لذا قم بذلك.
بمجرد الانتهاء من ذلك ، قم بتمكين إظهار كافة الملفات الخيار في Solution Explorer. قم بتوسيع مرجع الخدمة الذي أضفته سابقًا. انقر نقرًا مزدوجًا على Reference.svcmap
ملف.
سيكون هناك <NamespaceMappings />
العنصر ، الذي ستحتاج إلى تحريره. استمرار مثالي:
<NamespaceMappings>
<NamespaceMapping
TargetNamespace="http://company.com/MyCompany.Services.MyProduct"
ClrNamespace="MyCompany.Services.MyProduct" />
</NamespaceMappings>
احفظ الملف ، انقر بزر الماوس الأيمن على مرجع الخدمة وحدد تحديث مرجع الخدمة.
يمكنك إضافة العديد من التعيينات كما تحتاج (كنت بحاجة بالفعل اثنين). التأثير هو نفسه svcutil /namespace:
اقترب ، ولكن دون الحاجة إلى استخدام سطر الأوامر تستخدم نفسه ، مما يجعل التحديث أسهل.
الفرق مع Svcutil
الجانب السلبي لهذا النهج هو أنك تحتاج إلى استخدام تعيينات مساحة الاسم الصريحة. استخدام svcutil
, ، لديك خيار تعيين كل شيء لا يتم تعيينه بشكل صريح مثل هذا (الحل الذي كان جون سوندرز يشير إليه):
svcutil /namespace:*,MyCompany.Services.MyProduct ...
قد تفكر في استخدام:
<NamespaceMappings>
<NamespaceMapping
TargetNamespace="*"
ClrNamespace="MyCompany.Services.MyProduct" />
</NamespaceMappings>
لكن هذه الإرادة ليس العمل ، لأن Visual Studio يضيف ضمنيًا هذا التعيين ، مشيرًا إلى اسم مساحة الاسم التي نحاول التخلص منها. سيؤدي التكوين أعلاه إلى تشتكي Visual Studio من مفتاح مكرر.
مساحات أسماء صريحة:
عندما لا يتم تحديد مساحة اسم Explit في الكود الخاص بك ، فإنه يبدو أن .NET سوف يولد URI من النموذج http://schemas.datacontract.org/2004/07/MyCompany.Services.MyProduct
. يمكنك تعيين ذلك وكذلك مساحات الأسماء الواضحة في المثال الخاص بي ، لكنني لا أعرف ما إذا كان هناك أي ضمان لهذا السلوك. لذلك ، قد يكون الذهاب مع مساحة الاسم الصريحة أفضل.
NB: رسم خرائط اثنين من الأسماء المستهدفة لنفس Clrnamespace
نصائح أخرى
كانت حالة استخدامك خاطئة.
يجب ألا تضمن الخدمة أبدًا كمرجع في المقام الأول.
أعتقد أن svcutil.exe سوف يقبل مفتاح تحديد مساحة الاسم الكاملة للاستخدام.
في VS2010 والإصدارات الأحدث ، هناك طريقة لإعداد مساحات أسماء مخصصة. في Solution Explorer ، حدد "إظهار جميع الملفات" ثم افتح "مراجع الويب" في شجرة الحل ، وحدد الخدمة ، وحدد عقدة المرجع.
لسوء الحظ ، ليس لدي سمعة كافية لإظهار لقطة شاشة.