سؤال

وأنا أكتب التطبيق سيلفرلايت يدعو خدمة WCF.

وحل آخر يتضمن المشاريع التالية ل Silverlight:
- مشروع ويب لاستضافة التطبيق سلفرليغت
- التطبيق سيلفرلايت مشروع
- مشروع مكتبة فئة سيلفرلايت مع الإشارة إلى خدمة WCF

وعندما كنت تشغيل التطبيق سيلفرلايت على بلدي locahost، وسيلفرلايت استدعاء WCF باستخدام المضيف المحلي ويعمل بشكل جيد.

وبعد ذلك نشر خدمة الويب والتطبيقات ونشرها إلى ملقم آخر. تم تعديل ملف web.config للإشارة إلى عنوان نقطة النهاية نشرها.

والآن، تشغيل التطبيق سيلفرلايت بالبحث عن رابط المضيف المحلي للخدمة، إفنثوو نقطة النهاية في الملف web.config هو أن خادم نشرها.

من أين التطبيق سيلفرلايت يفحص عنوان الموقع SVC؟ لا يبدو أن يقرأها من ملف web.config. ولكن، يبدو أشبه عنوان الموقع كان جزءا لا يتجزأ في التجمع خلال بناء / عملية نشر.

وأية أفكار ؟؟

وشكرا لقراءة!

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

المحلول

والتطبيق سلفرليغت لا تبدو في Web.config لاستضافة خادم على الإطلاق - وهذا هو على جانب الملقم وغير مرئية إلى التطبيق سلفرليغت الذي يعمل على العميل. التطبيق سيلفرلايت يبدو في ملف ServiceReferences.clientconfig الخاصة أو في URL الذي تحدده برمجيا عند إنشاء وكيل خدمة المحلي في التعليمات البرمجية.

وهكذا، لديك 2 خيارات:
1. تعديل ServiceReferences.clientconfig قبل بناء النسخة الانتشار من التطبيق سيلفرلايت.
2. استخدام رمز لبناء النهاية العميل الخاص بك مع عنوان URL.

ونحن نستخدم 2nd الخيار لأننا نحب أن يكون واجهة البرامج القياسية التي بتكوين النهاية لدينا. ونحن نفعل شيئا من هذا القبيل (ولكن ليس مع من MAXVALUE إذا كان خدمة تواجه العامة، وبطبيعة الحال):

        public ImportServiceClient CreateImportServiceClient()
        {
            return new ImportServiceClient(GetBinding(), GetServiceEndpoint("ImportService.svc"));
        }

        public ExportServiceClient CreateExportServiceClient()
        {
            return new ExportServiceClient(GetBinding(), GetServiceEndpoint("ExportService.svc"));
        }

        protected override System.ServiceModel.Channels.Binding GetBinding()
        {
            BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None);
            binding.MaxBufferSize = int.MaxValue;
            binding.MaxReceivedMessageSize = int.MaxValue;
            binding.SendTimeout = TimeSpan.MaxValue;
            binding.ReceiveTimeout = TimeSpan.MaxValue;
            return binding;
        }

        protected EndpointAddress GetServiceEndpoint(string serviceName)
        {
            if (Settings == null)
            {
                throw new Exception("Service settings not set");
            }
            return
                new EndpointAddress(ConcatenateUri(Settings.ServiceUri,serviceName));
        }

        protected EndpointAddress GetServiceEndpoint(string serviceName, Uri address)
        {
            if (Settings == null)
            {
                throw new Exception("Service settings not set");
            }
            return new EndpointAddress(ConcatenateUri(address, serviceName));
        }

وفئات مثل "ImportServiceClient" و "ExportServiceClient" هي وكلاء الناتجة عن إنشاء مراجع خدمة لخدمات WCF لدينا. Settings.ServiceUri حيث نقوم بتخزين عنوان الملقم الذي يجب أن نتحدث إلى (في حالتنا تم تعيينه بشكل حيوي عبر المعلمات إلى البرنامج المساعد سلفرليغت في صفحة يتم استضافتها في ذلك، ولكن هل يمكن استخدام أي نظام تريد لإدارة هذا العنوان).

ولكن إذا كنت تفضل ببساطة قرص ServiceReferences.ClientConfig فإنك لا تحتاج إلى أي رمز من هذا القبيل.

نصائح أخرى

وأنا استخدم InitParams من وجوه سلفرليغت في صفحة آسيا والمحيط الهادئ التي تستضيف سيلفرلايت لتمرير رابط خدمة WCF. يمكنك الحصول على رابط من Web.config في الصفحة آسيا والمحيط الهادئ. وهو يعمل في حالتي.

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