سؤال

لدي مجموعة من WCF خدمات ويب مرتبطة بشكل حيوي عن طريق تطبيقات سطح المكتب.

مشكلتي هي حقا مفصلة إعدادات التكوين التي WCF يتطلب العمل.الحصول على SSL العمل ينطوي على إعدادات مخصصة.الحصول على MTOM أو أي شيء آخر يتطلب العمل أكثر.تريد ضغط ؟ هنا نذهب مرة أخرى...

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

أنا تريد أن تجعل سطح المكتب التطبيق أسهل بكثير من تكوين - من الناحية المثالية نوعا من الاكتشاف التلقائي.مستخدمي سطح المكتب التطبيق يجب أن تكون فقط قادرة على إدخال URL وأنها تفعل بقية.

لا أحد يعرف طريقة جيدة للقيام بذلك ؟

أنا أعرف Visual Studio يمكن تعيين التكوين بالنسبة لك, ولكن أريد سطح المكتب التطبيق لتكون قادرة على القيام بذلك على أساس مجموعة متنوعة واسعة من مختلف server مجموعة عمليات.

وأنا أعلم أن VS أدوات يمكن استخدامها خارجيا, ولكن أنا أبحث عن مستخدمي تطبيقات سطح المكتب لا يجب أن تكون WCF الخبراء.أنا أعرف MS جعلت هذا عمدا أكثر تعقيدا.

هل هناك أي طريقة آلية ، مكتبة 3rd الطرف أو أي شيء لجعل السيارات-اكتشاف WCF الإعدادات ممكن ؟

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

المحلول

جميع المعلومات عن نقطة النهاية هو متاح في البيانات الوصفية من الخدمة ، يمكنك كتابة العميل ما سوف استكشاف البيانات الوصفية من الخدمة وسيتم تكوين العميل.عن مدونة سبيل المثال يمكن أن ننظر إلى هذا ممتاز مكس Explorer من Juval لوي.

نصائح أخرى

شكرا, هذا مفيد رمز (+1).

انها أكثر قليلا فوضوي على الرغم من لديه بعض الخلل (القضية الحساسة الشيكات التي لا ينبغي أن يكون ، على سبيل المثال) ، وقد حمولة من واجهة المستخدم الوظائف التي لا تحتاج ويكرر الكثير من التعليمات البرمجية.

لقد اتخذت من ذلك الفعلية اكتشاف آلية إعادة كتابته تقريبا حصلت عليه العامل (يربط لكن يحتاج بعض بارعة).

أولا بعض util وظائف يستخدمها الأسلوب الرئيسي:

/// <summary>If the url doesn't end with a WSDL query string append it</summary>
static string AddWsdlQueryStringIfMissing( string input )
{
    return input.EndsWith( "?wsdl", StringComparison.OrdinalIgnoreCase ) ?
        input : input + "?wsdl";
}

/// <summary>Imports the meta data from the specified location</summary>
static ServiceEndpointCollection GetEndpoints( BindingElement bindingElement, Uri address, MetadataExchangeClientMode mode )
{
    CustomBinding binding = new CustomBinding( bindingElement );
    MetadataSet metadata = new MetadataExchangeClient( binding ).GetMetadata( address, mode );
    return new WsdlImporter( metadata ).ImportAllEndpoints();
}

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

public static ServiceEndpointCollection Discover( string url )
{
    Uri address = new Uri( url );
    ServiceEndpointCollection endpoints = null;

    if ( string.Equals( address.Scheme, "http", StringComparison.OrdinalIgnoreCase ) )
    {
        var httpBindingElement = new HttpTransportBindingElement();

        //Try the HTTP MEX Endpoint
        try { endpoints = GetEndpoints( httpBindingElement, address, MetadataExchangeClientMode.MetadataExchange ); }
        catch { }

        //Try over HTTP-GET
        if ( endpoints == null )
            endpoints = GetEndpoints( httpBindingElement,
                new Uri( AddWsdlQueryStringIfMissing( url ) ), MetadataExchangeClientMode.HttpGet );
    }
    else if ( string.Equals( address.Scheme, "https", StringComparison.OrdinalIgnoreCase ) )
    {
        var httpsBindingElement = new HttpsTransportBindingElement();

        //Try the HTTPS MEX Endpoint
        try { endpoints = GetEndpoints( httpsBindingElement, address, MetadataExchangeClientMode.MetadataExchange ); }
        catch { }

        //Try over HTTP-GET
        if ( endpoints == null )
            endpoints = GetEndpoints( httpsBindingElement,
                new Uri( AddWsdlQueryStringIfMissing( url ) ), MetadataExchangeClientMode.HttpGet );
    }
    else if ( string.Equals( address.Scheme, "net.tcp", StringComparison.OrdinalIgnoreCase ) )
        endpoints = GetEndpoints( new TcpTransportBindingElement(), 
            address, MetadataExchangeClientMode.MetadataExchange );

    else if ( string.Equals( address.Scheme, "net.pipe", StringComparison.OrdinalIgnoreCase ) )
        endpoints = GetEndpoints( new NamedPipeTransportBindingElement(), 
            address, MetadataExchangeClientMode.MetadataExchange );

    return endpoints;
}

الآن هناك طريقة أخرى للقيام بذلك التي لم تكن متوفرة عندما سألت السؤال الأصلي.مايكروسوفت الآن يدعم بقية خدمات WCF.

  • الجانب السلبي من استخدام بقية هو أن تفقد WSDL.
  • الاتجاه الصعودي هو الحد الأدنى من التكوين الخاص بك WCF العقد واجهات سوف لا تزال تعمل!

سوف تحتاج إشارة جديدة إلى System.ServiceModel.Web

مارك العمليات الخاصة بك مع أي WebInvoke أو WebGet

//get a user - note that this can be cached by IIS and proxies
[WebGet]
User GetUser(string id )

//post changes to a user
[WebInvoke]
void SaveUser(string id, User changes )

إضافة هذه إلى موقع سهل - إضافة .svc ملف:

<%@ServiceHost 
   Service="MyNamespace.MyServiceImplementationClass" 
   Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

مصنع خط يحكي ASP.net كيفية تفعيل نقطة النهاية - أنت لا تحتاج الى جانب الخادم التكوين في كل شيء!

ثم بناء الخاصة بك ChannelFactory هو الى حد كبير دون تغيير, إلا أنك لا تحتاج إلى تحديد نقطة النهاية أي أكثر (أو لصناعة السيارات في اكتشاف واحد كما قلت في إجابات أخرى)

var cf = new WebChannelFactory<IMyContractInterface>();
var binding = new WebHttpBinding();

cf.Endpoint.Binding = binding;
cf.Endpoint.Address = new EndpointAddress(new Uri("mywebsite.com/myservice.svc"));
cf.Endpoint.Behaviors.Add(new WebHttpBehavior());

IMyContractInterface wcfClient = cf.CreateChannel();

var usr = wcfClient.GetUser("demouser");
// and so on...

علما أنه لم يتم اكتشاف العميل التكوين - لا يوجد المحلية التكوين حاجة!

كبير آخر رأسا على عقب هو أنه يمكنك التبديل بسهولة إلى سلمان التسلسل - أن تسمح نفس خدمات WCF إلى أن تستهلك من قبل جافا, أكشن, جافا سكريبت, Silverlight أو أي شيء آخر يمكن التعامل مع JSON و بقية بسهولة.

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