سؤال

أحتاج إلى تقديم ميزة تصدير إلى Excel لكمية كبيرة من البيانات التي يتم إرجاعها من خدمة الويب WCF.

الكود لتحميل طبيب البيانات هو كما يلي:

List<resultSet> r = myObject.ReturnResultSet(myWebRequestUrl);  //call to WCF service
myDataList.DataSource = r;
myDataList.DataBind();

أنا أستخدم كائن الاستجابة للقيام بالمهمة:

Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition", "attachment; filename=MyExcel.xls");
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter tw = new HtmlTextWriter(sw);
myDataList.RenderControl(tw);
Response.Write(sb.ToString());
Response.End();

تكمن المشكلة في أن خدمة WCF تُخرج للحصول على كمية كبيرة من البيانات (حوالي 5000 صف) وأن مجموعة النتائج فارغة. عندما أقوم بتصحيح الخدمة ، يمكنني رؤية النافذة لحفظ/فتح ورقة Excel قبل إرجاع الخدمة النتيجة ، وبالتالي فإن ورقة Excel فارغة دائمًا. الرجاء ساعدني لاكتشف ذلك.

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

إليكم httpmodule المخصص: الفئة العامة customHttpModule: ihttpmodule {public void dispose () {}

public void Init(HttpApplication appln) 
{ 
    appln.AuthorizeRequest+= delegate 
    { 
        HttpContext tcontext= HttpContext.Current; 
        string path = tcontext.Request.AppRelativeCurrentExecutionFilePath; 

        int i = path.IndexOf('/', 2); 
        if (i > 0) 
        { 
            string svc = path.Substring(0, i) + ".svc"; 
            string fu = path.Substring(i, path.Length - i); 
            tcontext.RewritePath(svc, fu, tcontext.Request.QueryString.ToString(), false); 
        } 
    }; 
} 

}

أرى أن Appln.Authorizerequest يسمى مرتين. أعتقد أن هذا هو السبب في أنني أرى وقت التشغيل أو استثناء الاتصال. كيف أوقف ذلك من القيام بذلك مرتين. أنا فقط إنشاء طلب واحد.

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

المحلول 2

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

هذه مقالة - سلعة ساعدني في فهم المزيد عن خدمة REST WCF والخنق. ما نجح بالفعل بالنسبة لي هو تعيين ServiceBehavior سمة لفئة الخدمة الخاصة بي.

[ServiceBehavior(MaxItemsInObjectGraph=2147483646)]
public abstract class MyService: IMyService

{بلاه ...}

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

نصائح أخرى

لقد واجهت واحدة من العديد من أنواع مهلة وحدود WCF/IIS. قد يكون هذا الشخص بالذات maxreceivedmessagesize. الافتراضي هو 64 كيلو بايت. تكوين هذا على ربط الخدمة.

الحدود الأخرى هي (هذه ليست كل معلمات ملزمة):

  • MaxItemSinObjectGraph (65536)
  • MaxRequestLength (4 ميغابايت)
  • ExecutionTimeout (90 ثانية)
  • SendTimeout على العميل (10 دقائق)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top