سؤال

لدي خدمة WCF التي أريد العودة إلى DataTable.وأنا أعلم أن هذا هو في كثير من الأحيان للغاية-مناقشة الموضوع ، بقدر ما إذا كان أو لا ترد DataTables هو ممارسة جيدة.دعونا نضع جانبا للحظة.

عند إنشاء DataTable من الصفر ، كما توجد أي مشاكل على الإطلاق.يتم إنشاء الجدول المأهولة بالسكان ، وعاد إلى العميل ، و هي:

[DataContract]
public DataTable GetTbl()
{
    DataTable tbl = new DataTable("testTbl");
    for(int i=0;i<100;i++)
    {
        tbl.Columns.Add(i);
        tbl.Rows.Add(new string[]{"testValue"});
    }
    return tbl;
}

ومع ذلك ، بمجرد أن أخرج وضرب قاعدة البيانات لإنشاء الجدول أدناه ، أحصل على CommunicationException "تم إغلاق الاتصال الأساسي:وقد تم إغلاق الاتصال بشكل غير متوقع."

[DataContract]
public DataTable GetTbl()
{
    DataTable tbl = new DataTable("testTbl");
    //Populate table with SQL query

    return tbl;
}

الجدول يتم ملؤها بشكل صحيح على جانب الملقم.هو أصغر بكثير من الجدول اختبار أنني يحلق من خلال وعاد و الاستعلام صغيرة وسريعة - لا يوجد مشكلة هنا مع مهلة أو نقل بيانات كبيرة.نفس وظائف DataContracts/ServiceContracts/BehaviorContracts يتم استخدامها.

لماذا طريقة الجدول يتم ملؤها لها أي تأثير على الجدول العودة بنجاح ؟

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

المحلول

لأحد من مشاكل مماثلة ، لقد حل مشكلتي.كان عدة أضعاف.

  • كما دارين اقترح بول احتياطيا ، ماكس..حجم خصائص في تكوين بحاجة إلى توسيعه.على SvcTraceViewer فائدة ساعدت في تحديد هذا, لكنه لا يزال لا تعطي دائما مفيدة للغاية رسائل الخطأ.
  • ويبدو أيضا أنه عندما الخدمة المرجعية تحديث على جانب العميل التكوين في بعض الأحيان لا يتم تحديث بشكل صحيح (على سبيل المثالتغيير التكوين القيم على الخادم ليس دائما صحيح التحديث على العميل.كان علي أن أذهب في تغيير ماكس..حجم خصائص عدة مرات على كل من العميل والخادم الجانبين في سياق التصحيح)
  • بالنسبة DataTable أن يكون تسلسل ، فإنه يحتاج إلى أن يعطى اسم.منشئ افتراضي لا يعطي الجدول اسم ذلك:

    return new DataTable();
    

    لن يكون تسلسل حين:

    return new DataTable("someName");
    

    واسم الجدول ما يتم تمرير المعلمة.

    ملاحظة هذا الجدول يمكن أن تعطى في أي وقت عن طريق تعيين السلسلة إلى TableName الملكية DataTable.

    var table = new DataTable();
    table.TableName = "someName";
    

نأمل أن يساعد شخص ما.

نصائح أخرى

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

  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" 
              switchValue="Information" 
              propagateActivity="true">
        <listeners>
          <add name="ServiceModelTraceListener" 
               type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
               initializeData="wcf-traces.svclog"/>
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

يمكنك بعد ذلك فتح الملف الناتج في SvcTraceViewer.exe الأداة التي تأتي في .NET Framework SDK (أو مع Visual Studio).على الجهاز الخاص بي ، ويمكن العثور عليها في %PROGRAMFILES%\Microsoft SDKs\Windows\v6.0A\Bin\SvcTraceViewer.exe.

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

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

DataTable result = new DataTable("result");

//linq to populate the table

Dataset ds = new DataSet();
ds.Tables.Add(result);
return ds.Tables[0];

آمل أن يساعد :)

بخلاف تحديد القيم القصوى لجميع سمات ملزمة.

تأكد من أن كل طاولة كنت تمر/عودته من خدمة ويب يجب أن يكون اسم الجدول ، مما يعني table.tablename الملكية لا ينبغي أن تكون فارغة.

السمة تريد OperationContract (في الواجهة) / عملية السلوك (على الطريقة):

[ServiceContract]
public interface ITableProvider
{
    [OperationContract]
    DataTable GetTbl();
}


[OperationBehavior]
public DataTable GetTbl(){
    DataTable tbl = new DataTable("testTbl");
    //Populate table with SQL query

    return tbl;
}

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

بشكل افتراضي wsHttpBinding قد تتلقى حجم الحصص من 65 كيلوبايت ، حتى إذا كان تسلسل جدول بيانات XML هو أكثر من ذلك ، فإنه رمي خطأ (وأنا 95% من البيانات في الجدول أكثر من 65 KB مع البيانات في ذلك).

يمكنك تغيير إعدادات القارئ الحصص في web.config / app.config أو يمكنك وضعها على ملزمة سبيل المثال في التعليمات البرمجية.ولكن نعم, ربما ما هي مشكلتك, إذا لم تكن قد غيرت بشكل افتراضي.

WSHttpBindingBase أعضاء - انظر ReaderQuotas الملكية وكذلك MaxReceivedMessageSize الملكية.

ربما فجر حصة الخاص بك - datatable أكبر من الحد الأقصى المسموح به لحجم الحزمة الخاصة بك الاتصال.

ربما تحتاج إلى تعيين MaxReceivedMessageSize و MaxBufferSize إلى أعلى القيم على الاتصال.

هناك 3 أسباب فشل عودة نوع datatable في خدمات WCF

  • يجب تحديد بيانات الجدول اسم مثل:

    MyTable=new DataTable("tableName");
    
  • عند إضافة مرجع على جانب العميل من خدمة WCF حدد قابلة لإعادة الاستخدام dll system.data

  • تحديد السمة على datatable عضو متغير مثل

    [DataMember]
    public DataTable MyTable{ get; set; }
    

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

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

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