سؤال

لقد كتبت صغير مرحبا العالم اختبار التطبيق في Silverlight الذي أريد أن تستضيف على لينكس/Apache2 الخادم.أريد البيانات تأتي من الخلية (أو لينكس متوافق db) حتى أستطيع أن databind إلى الأشياء في ديسيبل.

لقد تمكنت من الحصول على عمل باستخدام MySQL Connector/.صافي:

MySqlConnection conn = new MySqlConnection("Server=the.server.com;Database=theDb;User=myUser;Password=myPassword;");
conn.Open();
MySqlCommand command = new MySqlCommand("SELECT * FROM test;", conn);
using (MySqlDataReader reader = command.ExecuteReader())
{
     StringBuilder sb = new StringBuilder();
     while (reader.Read())
     {
         sb.AppendLine(reader.GetString("myColumn"));
     }
     this.txtResults.Text = sb.ToString();
}

هذا يعمل بشكل جيد إذا أعطي نشر التطبيق ClickOnce ثقة كاملة (أو على الأقل SocketPermission) ، تشغيله محليا.

أريد هذا إلى تشغيل على الملقم و لا أستطيع الحصول على عمل, دائما تنتهي بإذن استثناء (SocketPermission لا يسمح).

قاعدة البيانات المستضافة على نفس الخادم سيلفرلايت التطبيق إذا كان ذلك يجعل من أي اختلاف.

تحرير حسنا, أنا الآن أفهم لماذا انها فكرة سيئة أن يكون db التفويض في التطبيق العميل (من الواضح).كيف يفعل الناس هذا ؟ كيف يمكنك ضمان وكيل خدمة ويب بحيث مرحلات البيانات من العميل/db بطريقة آمنة ؟ هل هناك أي أمثلة من هناك على شبكة الإنترنت ؟

بالتأكيد, لا أستطيع أن أكون أول شخص ترغب في استخدام قاعدة البيانات إلى السلطة silverlight التطبيق ؟

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

المحلول

أسهل طريقة لفعل ما تريد (بعد قراءة من خلال التعديلات الآن :)) سوف يكون لفضح الخدمات التي يمكن استهلاكها.نمط أن مايكروسوفت تدفع الآن هو فضح خدمات WCF, ولكن الحقيقة هي أن سيلفرلايت يمكن العميل من استخدام رأس المال العامل إلى تستهلك الكثير من أنواع مختلفة من الخدمات.

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

صندوق رأس المال العامل يمكن أن يكون عميل فقط, server أو ملقم-عميل موصل منصة.ما اخترت سوف تؤثر على رمز الكتابة ، ولكن يجب أن تكون مستقلة من قاعدة البيانات الخاصة بك.التعليمات البرمجية الخاصة بك يمكن أن يكون منظما بحيث انها واحدة من الخرائط إلى جدول قاعدة بيانات ، أو أنها يمكن أن تكون أكثر مجردة (يمكنك إنشاء الطبقات التي تمثل كامل المنطقي الآراء إذا اخترت).

نصائح أخرى

في حين أن "الرسمية" الجواب هو استخدام رأس المال العامل لدفع خدمة Silverlight, أنا نوع من الشكل أن أي شخص باستخدام الخلية قد لا يكون باستخدام كاملة ASP.NET الحل.الحل هو بناء PHP ويب (مثل روب اقترح) التفاعل مع قاعدة بيانات MySQL و Silverlight الوصول إليها في راحة الطريقة.

هنا هو بداية الجزء الثالث تعليمي باستخدام سيلفرلايت إلى الوصول إلى قاعدة بيانات MySQL من خلال PHP خدمة ويب:

PHP, MySQL و Silverlight:كاملة التعليمي

سيلفرلايت لا تملك أي قدرة على الوصول مباشرة إلى خوادم قاعدة البيانات.ما يمكنك القيام به هو أن تعرض عمليات قاعدة البيانات من خلال خدمات الويب (ASMX أو رأس المال العامل ، حتى non-.NET!) و استخدام Silverlight الوصول إلى تلك الخدمات.

أنا فقط حصلت على هذا العمل ؛ ASP.NET4 الموقع مع Silverlight4 المحتوى على لينكس أوبونتو 10 / Apache2 الخادم.تم تطوير المحتوى باستخدام Visual Studio 2010.VS2008 يجب أن تعمل بشكل جيد جدا.

الخادم:

  • إعداد خادم لينكس مع Apache2 MySQL و هناك الكثير من الأدلة على هذا.
    • تأكد أن الخلية يمكن الوصول إليها من جهاز الكمبيوتر اختياريا من الإنترنت.انظر هنا لمزيد من التفاصيل: أسباب رفض الوصول الأخطاء.
    • إعداد قاعدة البيانات بنية الجدول و إضافة بعض المحتوى للاختبار في وقت لاحق.في مثالنا نحن نفترض أن لديك جدول 'أشخاص' مع عمود "الاسم".
  • منذ سيلفرلايت هو العميل التكنولوجيا كنت جيدة إلى حد كبير-إلى-يذهب ويمكن استضافة التطبيق مع صفحة HTML بسيطة.
  • خدمة ويب هو مطلوب بين Silverlight و MySQL.مايكروسوفت WCF RIA هو نكهة واحدة ، ولكن يتطلب .صافي.إلى جانب ، يمكنك الحصول على استضافة ASP.NET4 صفحات أيضا.هنا هو دليل شامل إلى إعداد عليه: إعداد أحادية 2.8 مع Asp.Net 4.0 و MVC2 على أوبونتو مع الخلية العضوية

Visual Studio:

  • تثبيت أحدث MySQL Connector/صافي وإعادة تشغيل مقابل
  • إضافة MySQL قاعدة بيانات كمصدر بيانات
    • افتح "مستكشف الملقم" - > إضافة اتصال بيانات -> اختر 'قاعدة بيانات MySQL'
    • ملء أوراق اعتماد اختبار الاتصال

إعداد الموقع مع الخلية الوصول:

هنا هو دليل وجدت مفيدة: خطوة خطوة دليل WCF RIA تمكين SL4 التطبيق مع إطار الكيان

  • إنشاء أو فتح مشروع Silverlight.
    • من جانب الملقم المشروع عادة ما يدعى 'ProjectName.ويب'
    • العميل المشروع عادة ما يدعى 'ProjectName'
  • Add 'ADO.NET الكيان نموذج البيانات إلى خادم project.وسوف يكون هذا نموذج هيكل قاعدة البيانات الخاصة بك.
    • حدد 'تولد من قاعدة البيانات'
    • اختر الخلية اتصال قاعدة البيانات الذي قمت بإنشائه
    • حدد الجداول التي تريد الوصول إليها
  • بناء الحل الخاص بك الآن قبل المتابعة.
  • إضافة المجال خدمة فئة' إلى خادم project f.ex.'FooDomain'.وهذا سيجعل قاعدة بيانات الكيانات المتاحة من جانب العميل سيلفرلايت رمز.
    • في 'المتاحة DataContext/ObjectContext فصول:' حدد إطار الكيان النموذج الذي قمت بإنشائه في الخطوة السابقة.
    • تحقق الجهات التي تريد الوصول إليها والتحقق 'تمكين التحرير' عند الاقتضاء
    • تحقق 'توليد المرتبطة الطبقات الفوقية'
  • بناء الحل الخاص بك مرة أخرى لتوليد 'FooDomainContext' ، على أساس 'FooDomain' في مشروع خادم.

اختبار:

دعونا الحصول على البيانات من MySQL إلى سيلفرلايت.على افتراض أن هناك جدول يسمى 'أشخاص' مع اسم العمود "الاسم" ، يمكننا ربط مربع قائمة تظهر أسماء الأشخاص.

أولا إضافة Silverlight الصفحة ، دعونا نقول "الوطن".في المنزل.xaml إضافة:

<ListBox x:Name="TestList" Width="100" />

في المنزل.xaml.cs الملف إضافة:

public partial class Home : Page
{
    public Home()
    {
        InitializeComponent();

        Loaded += Home_Loaded;
    }

    void Home_Loaded(object sender, RoutedEventArgs e)
    {
        var context = new FooDomainContext();
        var query = context.Load(context.GetPersonsQuery());
        TestList.ItemsSource = query.Entities;
        TestList.DisplayMemberPath = "name";
    }
}

نحن هنا نفترض أنك تسمية المجال الخاص بك خدمة 'FooDomain', و هذا من شأنه أن يولد 'FooDomainContext' الفئة المستخدمة.

نأمل, إذا كان كل شيء يتم تعيين بشكل صحيح, الآن سترى قائمة من أسماء الأشخاص عند تشغيل Silverlight المشروع.

تحرير: ASP.صافي ليس اختياري, ولكن المطلوب WCF RIA خدمة ويب التي تستخدم في بلدي على سبيل المثال.

وجود اتصالات DB مباشرة إلى الخادم من جانب العميل عادة ما يكون فكرة سيئة.أنا لا أعرف كم من السهل فك Silverlight التطبيق, ولكن أعتقد أنه من الممكن في بعض الطريق.ثم أنت في الأساس التخلي عن DB الخاص بك وثائق التفويض إلى المستخدمين.

يمكنك الحصول على البيانات من MySQL باستخدام خدمات ويب.

تجول:

الخطوة 1:إنشاء خدمات ويب

الخطوة 2:إضافة خدمة الإشارة إلى Silverlight


الخطوة 1:إنشاء خدمات ويب

إضافة Silverlight المشروع.

Add a new Silverlight project

إنشاء خدمة ويب جديدة.انقر بزر الماوس الأيمن على مشروع ويب > إضافة > عنصر جديد

Create a new Web Service

حدد "خدمة ويب".

enter image description here

الأولي قانون جديد خدمة ويب.

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;

namespace SilverlightApplication1.Web
{
    /// <summary>
    /// Summary description for WebService1
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class WebService1 : System.Web.Services.WebService
    {
        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }
    }
}

من أجل خدمة ويب قادرا على الاتصال إلى الخلية ، نحن بحاجة إلى إضافة مرجع MySql.Data.DLL في مشروع ويب وإضافة العبارة باستخدام على أعلى من خدمة ويب الدرجة:

using MySql.Data.MySqlClient; 

HelloWorld() أولية عينة الطريقة التي تم إنشاؤها بواسطة Visual Studio.قد ترغب في حذفه كما أنه ليست هناك حاجة.أنا ذاهب لإنشاء 2 طريقة بسيطة لإظهار كيف تستخدم خدمات ويب للتواصل بين SilverLight و MySQL.

الطريقة الأولى: ExecuteScalar()

هذا الأسلوب هو بسيط.الحصول على كائن واحد من الخلية.

public string ExecuteScalar(string sql)
{
    try
    {
        string result = "";
        using (MySqlConnection conn = new MySqlConnection(constr))
        {
            using (MySqlCommand cmd = new MySqlCommand())
            {
                conn.Open();
                cmd.Connection = conn;
                cmd.CommandText = sql;
                result = cmd.ExecuteScalar() + "";
                conn.Close();
            }
        }
        return result;
    }
    catch (Exception ex)
    {
        return ex.Message;
    }
} 

الطريقة الثانية: ExecuteNonQuery()

واحد SQL التنفيذ.مثال من نوع SQL:إدراج أو تحديث أو حذف.

public string ExecuteNonQuery(string sql)
{
    try
    {
        long i = 0;
        using (MySqlConnection conn = new MySqlConnection(constr))
        {
            using (MySqlCommand cmd = new MySqlCommand())
            {
                conn.Open();
                cmd.Connection = conn;
                cmd.CommandText = sql;
                i = cmd.ExecuteNonQuery();
                conn.Close();
            }
        }
        return i + " row(s) affected by the last command, no resultset returned.";
    }
    catch (Exception ex)
    {
        return ex.Message;
    }
}  

هذا هو كيف يمكن خدمة ويب يبدو بعد إضافة اثنين من الأساليب المذكورة أعلاه:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;
using MySql.Data.MySqlClient;

namespace SilverlightApplication1.Web
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class WebService1 : System.Web.Services.WebService
    {
        string constr = "server=localhost;user=root;pwd=1234;database=test;";

        [WebMethod]
        public string ExecuteScalar(string sql)
        {
            try
            {
                string result = "";
                using (MySqlConnection conn = new MySqlConnection(constr))
                {
                    using (MySqlCommand cmd = new MySqlCommand())
                    {
                        conn.Open();
                        cmd.Connection = conn;
                        cmd.CommandText = sql;
                        result = cmd.ExecuteScalar() + "";
                        conn.Close();
                    }
                }
                return result;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

        [WebMethod]
        public string ExecuteNonQuery(string sql)
        {
            try
            {
                long i = 0;
                using (MySqlConnection conn = new MySqlConnection(constr))
                {
                    using (MySqlCommand cmd = new MySqlCommand())
                    {
                        conn.Open();
                        cmd.Connection = conn;
                        cmd.CommandText = sql;
                        i = cmd.ExecuteNonQuery();
                        conn.Close();
                    }
                }
                return i + " row(s) affected by the last command, no resultset returned.";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }  
    }
} 

ستلاحظ أن سمة من [WebMethod] إضافة إلى الأساليب.

إعادة بناء المشروع والسماح خدمة ويب تكون جاهزة الخطوة التالية.

Rebuild the project

خدمة ويب إذن الوصول

يرجى ملاحظة أنه بشكل افتراضي, خدمة ويب تسمح فقط تلك Silverlight التي يتم استضافتها في نفس المجال مع خدمة ويب الوصول إليها.إذا كان تطبيق Silverlight يتم استضافتها على موقع آخر/المجال, خدمة ويب ينكر البلاغ.ولذلك علينا أن تكوين إذن خدمة ويب يمكن الوصول إليها من قبل Silverlight التي استضافتها في مجال مختلف.

لديك لإنشاء اثنين من ملفات إضافية: clientaccesspolicy.xml و crossdomain.xml.

هذه الملفات يجب أن يوضع في جذر المجال حيث خدمات الويب المستضافة.

على سبيل المثال: http://www.mywebsite.com/clientaccesspolicy.xml و http://www.mywebsite.com/crossdomain.xml

clientaccesspolicy.xml

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="SOAPAction">
        <domain uri="*"/>
      </allow-from>
      <grant-to>
        <resource path="/" include-subpaths="true"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

إذا كنت فقط تريد أن تسمح خدمة ويب يمكن الوصول إليها من خلال مجال معين (على سبيل المثال:www.myanotherwebsite.com) يمكنك إضافته داخل .على سبيل المثال:

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="SOAPAction">
        <domain uri="http://www.myanotherwebsite.com"/>
      </allow-from>
      <grant-to>
        <resource path="/" include-subpaths="true"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

crossdomain.xml

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE cross-domain-policy SYSTEM 
"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <allow-http-request-headers-from domain="*" headers="SOAPAction,Content-Type"/>
</cross-domain-policy>

لفهم المزيد عن هذا ، يرجى قراءة: مما يجعل من الخدمات المتاحة عبر المجال الحدود (MSDN)التالي


الخطوة 2:إضافة خدمة الإشارة إلى Silverlight

إضافة خدمة الإشارة إلى سيلفرلايت.

Add a Service Reference to Silverlight

اكتب عنوان ويب الخدمة ثم اضغط على [Go].

مثال على العنوان: http://www.mywebsite.com/MyCoolWebService.asmx

تغيير الاسم إلى صالحك ، اضغط على [موافق].

Web Service Browser

Visual Studio بتحليل الشبكة خدمات ربط البيانات و إنشاء فئة.

قبل مواصلة الترميز ، دعونا نرى ما هي الطرق التي يمكننا استخدامها في إنشاء فئة.انقر بزر الماوس الأيمن على الطبقة الجديدة ثم اختر [عرض في "مستعرض الكائنات"].

View in Object Browser

الفئة التي نحن بصدد استخدامها WebService1SoapClient (في هذا المثال).تسمية يقوم على اسم الخدمة.إذا كان اسم ونحن لدينا خدمة صف MyCoolWebService ، ثم MyCoolWebServiceSoapClient سيتم اختيار اسم الفئة في سيلفرلايت.في حق الفريق ، طريقتين وهما ويسلط الضوء على أحداث.تلك هي الأساليب المستخدمة في استدعاء خدمات ويب.

Object of WebService1SoapClient

يتيح إنشاء بسيط تطبيق Silverlight بإضافة مربع نص و اثنين من الأزرار.

في هذا المثال, المستخدم الرئيسية في استعلام SQL مباشرة في مربع النص.

زر [ExecuteScalar] سوف ترسل SQL إلى خدمة ويب واسترجاع البيانات مرة أخرى.(حدد, عرض, الخ.)

زر [ExecuteNonQuery] سوف ترسل SQL إلى خدمة ويب على التنفيذ فقط.(INSERT, UPDATE, DELETE, الخ.)

Design a simple SilverLight App

هذا هو رمز الأولي وراء مشارك.xaml:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SilverlightApplication1
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private void btExecuteScalar_Click(object sender, RoutedEventArgs e)
        {
        }

        private void btExecuteNonQuery_Click(object sender, RoutedEventArgs e)
        {
        }
    }
}

الآن, هذه هي ما نحن بصدد القيام به هنا:

  • تعلن الخدمة كما هو ثابت كائن في مستوى الصف:ServiceReference1.WebService1SoapClient
  • إنشاء الخدمة الانتهاء من الحدث من طريقتين.
  • استدعاء الخدمة في حال النقر على زر.
  • عرض خدمة النتيجة:MessageBox.عرض()


public partial class MainPage : UserControl
{
    ServiceReference1.WebService1SoapClient myService;

    public MainPage()
    {
        InitializeComponent();
        myService = new ServiceReference1.WebService1SoapClient();
        myService.ExecuteScalarCompleted += myService_ExecuteScalarCompleted;
        myService.ExecuteNonQueryCompleted += myService_ExecuteNonQueryCompleted;
    }

    void myService_ExecuteNonQueryCompleted(object sender, 
                   ServiceReference1.ExecuteNonQueryCompletedEventArgs e)
    {
        MessageBox.Show(e.Result);
    }

    void myService_ExecuteScalarCompleted(object sender, 
         ServiceReference1.ExecuteScalarCompletedEventArgs e)
    {
        MessageBox.Show(e.Result);
    }

    private void btExecuteScalar_Click(object sender, RoutedEventArgs e)
    {
        myService.ExecuteScalarAsync(textBox1.Text);
    }

    private void btExecuteNonQuery_Click(object sender, RoutedEventArgs e)
    {
        myService.ExecuteNonQueryAsync(textBox1.Text);
    }
}

اضغط [F5], في تشغيل واختبار تطبيق Silverlight.

Testing

Testing

Testing

جنبا إلى جنب مع الإبداع ، وأعتقد أنك يمكن أن تفعل شيئا أكثر من هذا الآن تبتسم | :)

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

update the Service Reference

سعيد الترميز.

اقرأ المزيد:

  1. المشاركة الأصلية - ربط الخلية من سيلفرلايت مع خدمات الويب - CodeProject.com (كتبه لي)
  2. الوصول إلى خدمة ويب من تطبيق Silverlight
  3. كيفية:كتابة بسيطة خدمة ويب باستخدام Visual C# .صافي
  4. كيفية:بناء خدمة العملاء Silverlight
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top