سؤال

أنا النامية Silverlight 3 التطبيق الذي كنت ترغب في الاتصال إلى خدمة ويب مع المقدمة .dll أو مع الصابون.ولكن .dll ليست مناسبة سيلفرلايت لذلك أنا لا يمكن أن تفعل ذلك.وأنا لا يمكن الوصول إلى الصابون لأنه عبر المجال المسائل (لا استضافة لذلك clientpolicy xml لا تفعل).

لذلك الحل هو إدراج .dll في WCF تمكين خدمة ويب في المجال والسماح تطبيق Silverlight استدعاء خدمة ويب.يعمل هذا.

الآن مشكلتي:العميل المقدمة من .dll المشار إليه من قبل بلدي ويب لديها .ربط() طريقة لذلك يجب أن إنقاذ الدولة من وجوه.ولكن يمكنني أن أفعل ذلك ؟ Proberly ليس بسبب سيلفرلايت هو عدم دعم wsHttpBinding.وأنا أعلم أنني يمكن الوصول إلى متغيرات جلسة العمل ASP ولكن يمكن أيضا أن الخروج من المتصفح ؟ أنا يمكن فقط معرفة حل مشكلتي التي يتم توفير اسم المستخدم/كلمة المرور في ASP الدورة الاتصال .الاتصال (طريقة) في كل طريقة.ولكن هذا هو حقا سيئة الحل.

أفكار أفضل ؟


أنا لا أعتقد أنني قد أوضحت لك و أعتذر عن ذلك.لغتي الإنجليزية بشكل صحيح السبب الرئيسي لذلك.

لدي:

بلدي سيلفرلايت التطبيق الذي يعمل على الموقع من المتصفح

بلدي خدمة WCF التي يتم استضافتها في نفس المجال.

عبر النطاقات خدمة ويب (لا أستطيع الوصول إلى مخزن عبر نهج المجال الملف)

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

بلدي ويب يبدو مثل هذا (في الطريقة التجريدية):

class MyWebService
{
   CrossDomainWebServiceClient client = new CrossDomainWebServiceClient();

   public void Connect(string username, string password)
   {
      client.Connect(username, password);
   }

   public object Foo()
   {
      //GetEmployees() do only work if I'm connected
      return client.GetEmployees(); 
   }
}

فو() طريقة لا تعمل لأنها دورة في الدعوة وليس في الدورة سبيل المثال.أريد هذا العمل.وبالتالي فإن العميل وجوه تحتاج إلى الحفاظ على المكالمة التالية.الدورة.مطلوب لا تعمل في سيلفرلايت لأن wsHttpBinding على ما يبدو غير معتمد.

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

المحلول

أنا لست متأكدا 100 ٪ أفهم السؤال ولكن لدي حالة مشابهة إلى حد ما أن أعمل مع هنا هو كيف نتعامل معها.

  1. الطرف الثالث ويب التي بتخزين كافة البيانات.
  2. WCF الطبقة الوسطى التي أنشأتها الولايات المتحدة إلى التعامل مع جميع التفاعلات مع خدمة ويب.
  3. سيلفرلايت العميل الطبقة التي يربط إلى خدمة WCF.

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

من الواضح أنك لن ترغب في تعيين اسم المستخدم وكلمة المرور كما كوكي.ولكن نأمل أن تتمكن من الحصول على بعض نوع من ملف تعريف الارتباط أو الرمز المميز من خدمة ويب الذي يمكن استخدامه في الطلبات المستقبلية.

تحديث الإجابة

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

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ProxyService
{
    private static Dictionary<Guid, DateTime> clients = new Dictionary<Guid, DateTime>();

    public ProxyService()
    {

    }

    [OperationContract]
    public void Login()
    {
        Guid id = Guid.NewGuid();
        // perform your login here
        clients.Add(id, DateTime.Now); // store your client instead of a date
        SetCookie(id);
    }

    [OperationContract]
    public DateTime Foo()
    {
        var id = ReadCookie();
        if (clients.ContainsKey(id))
        {
            return clients[id];
        }
        return DateTime.MinValue;
    }

    private void SetCookie(Guid id)
    {
        var cookie = new HttpCookie("id", id.ToString());
        cookie.Expires = DateTime.Now.AddMinutes(10);
        HttpContext.Current.Response.AppendCookie(cookie);
    }

    private Guid ReadCookie()
    {
        var cookie = HttpContext.Current.Request.Cookies.Get("id");
        if (cookie != null)
        {
            cookie.Expires = DateTime.Now.AddMinutes(10);
            return new Guid(cookie.Value);
        }
        return Guid.Empty;
    }
}

بالطبع, بدلا من التاريخ والوقت يمكنك تخزين الخاص بك خدمة العملاء.الآن هناك عدد قليل من القضايا مع هذا النهج أن كنت لا تزال بحاجة إلى حل.

  1. مهلة - كنت بحاجة الى بعض وسيلة مهلة الدورات التي ليست نشطة واضحة لهم من قائمة من العملاء.
  2. لست متأكدا إذا كان هذا هو السوبر وسيلة آمنة للقيام بالأشياء.إذا كان شخص ما حصلت على guid ثم يمكن الوصول إلى الموظفين.ومع ذلك, أنا لا أرى كيف يمكن لهذا أن يحدث, ولكن أنا لست خبير أمني.

هذا هو عليه الآن, إذا كان لديك أسئلة اسمحوا لي أن أعرف.

نصائح أخرى

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

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

تحديث:

ويمكنك بمناسبة الخدمة الخاص بك للاحتفاظ كائن خدمة في الذاكرة لحياة الدورة.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
class MyWebService{   
    CrossDomainWebServiceClient client = new CrossDomainWebServiceClient();   

وهذا يجب أن تبقي العميل عبر تهيئة نطاقك بين المكالمات.

والجواب الأصل:

والكائن سيلفرلايت يبقى على قيد الحياة بين المكالمات حتى تتمكن من الحفاظ على الدولة في الذاكرة.

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

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