‫مصائب پیاده سازی پروتکل ECE

تا زمانی که فقط صحبت از نوشتن کدهای پروتکل و تست آن با دبیرخانه خودتان است همه چیز مثل قند و عسل شیرین است. ولی وقتی که قرار شد این ارتباط با دبیرخانه‌های دیگر تست شود آن وقت می‌فهمید که زهر مار چه مزه‌ای است!

یکی از بزرگترین مشکلات و مصیبت‌ها عدم تست بیشتر دبیرخانه‌های موجود است چون بیشتر دبیرخانه‌های شرکت‌ها صرفا با خودشان تست شده و کار می‌کنند. برای این دسته از دبیرخانه‌ها هیچ وقت پیش نیامده که به دبیرخانه یا اتوماسیونی غیر از محصول شرکت خودشان نامه ECE بفرستند یا بگیرند. و در این حالت این بدبختی من برنامه نویس است که باید هم کدهای خودم را تست کنم و هم محصول شرکت‌های آن طرف خط را که بعضا مدت‌هاست روی کد مربوط به پروتکل کار نکرده‌اند و یا حتی برنامه نویس مربوطه از آن شرکت رفته است. این را هم بیفزایید که بعضی دوستان اصرار دارند از موضع برتر صحبت کرده و هیچ وقت قبول نمی‌کنند که برنامه‌ای که نوشته‌اند ایراد دارد یا این که پروتکل ارتباطی را بد فهمیده‌اند. مثلا یکی از شرکت‌ها که اتفاقا از شرکت‌های قدیمی ایران در امر نرم افزار است رشته زیر را به عنوان تاریخ نامه در XML ارسال می‌کند. در حالی که در پروتکل گفته شده که این رشته باید بر اساس استاندارد ISO 8601 باشد. در تعریف استاندارد ۸۶۰۱ هم گفته شده که این استاندارد بر مبنای تاریخ میلادی است و شامل هیچ رشته‌ای مثل +03:30 هم نمی‌باشد.

 1387-07-22T16:15:35+03:30

عدم رعایت کوچک و بزرگی حروف یا همان Case Sensitivity هم یکی دیگر از مشکلات رایج است. این مشکل در همه جا نمود دارد هم در هدرهای ایمیل و هم در XML تولیدی. مثلا فلان شرکت elementها و attirbuteهای XML را بدون توجه به این که XML به کوچک و بزرگی حروف حساس است تولید می‌کند و بهمان شرکت هم هدر ایمیل را با فرض حساس بودن به کوچک و بزرگ بودن حروف پردازش می‌کند در حالی که هدر ایمیل به حروف کوچک و بزرگ حساس نیست.

در مورد حساسیت هدر ایمیل به کوچکی و بزرگی حروف هم باید گفت که مطابق RFC 2822 و توضیحات اینجا حساس نیست. در اینجا هم گفته شده که نام هدر همیشه غیر حساس به حروف کوچک و بزرگ است ولی مقدار هدر بسته به حالت ممکن است حساس باشد یا نباشد. اگر از literal استفاده شود یعنی از حروف الفبای انگلیسی که محصور در دابل کوتیشن باشند مثل A و Header1 آن وقت حساسیتی وجود ندارد ولی اگر از از مقادیر داده‌ای که شبیه مقادیر اسکی دسیمال و… می‌باشد مثل «%d» قضیه فرق می‌کند.

Comments

  1. Afshar Mohebbi

    فید بلاگ اینه:‏
    http://feeds.feedburner.com/Afsharm
    فید کامنت‌های این پست هم اینه:‏
    http://afsharm.blogspot.com/feeds/6391502771413697782/comments/default

    البته اگه با مرورگرهای فایر فاکس یا نسخه‌های جدید IE وبلاگ را ببینید خود مرورگر فیدهای موجود را در سایت را تشخیص داده و به شما معرفی می‌کند.‏

  2. ناشناس

    سلام
    خسته نباشید
    داشتم دنبال یک سری اطلاعات در مورد ارتباط ece
    با سیستم پیام دولت می گشتم
    فکر کنم شما مهندس محبی تو شرکت فراکنش باشین
    اگر درست هست دوست دارم با هم تبادل اطلاعات داشته باشیم
    آدرس من
    kashani@irisl.net
    هست
    خوشحال می شم تماس بگیرید

  3. Afshar Mohebbi

    جناب آقای کاشانی،
    من هم خیلی دوست دارم و خوشحال می‌شوم که با شما و دیگر علاقه‌مندان در مورد پروتکل ECE تبادل اطلاعات و همکاری داشته باشم. چه در قالب همکاری قبلی‌مان به صورت شرکتی و چه به صورت یک همکاری صرفا دوستانه. بنده به شدت امیدوار هستم این پروتکل بتواند نقطه عطفی در صنعت نرم افزار ایران باشد و بتواند اعتماد کارفرمایان را به نرم افزارهای کامپیوتری جلب کند. در همین جا هم از شما و بقیه دوستان علاقه‌مند خواهش می‌کنم در این راه به من کمک کنید. من هم هر اطلاعات و تجربه‌ای در این مورد به دست بیاورم در این وبلاگ خواهم گذاشت و در صورت لزوم به صورت خصوصی به اطلاع شما خواهم رساند.

  4. ناشناس

    با سلام و خسته نباشيد
    در رابطه با پياده سازي پروتكل ECE يكسري سوالات داشتم :
    1- من توانستم يك فايل ورد را با استفاده از C# و Tobase64 به شكل يك رشته دراورده و در فايل Xml در تگ Origin-text ذخيره كنم ولي در موقع برگرداندن و ذخيره اين رشته به يك فايل ورد محتويات فايل به شكل كاراكترهاي عجيب همراه با متن اصلي آورده ميشود و البته encode utf8 را هم رعايت كرده ام . آيا شما ميتوانيد كمك كنيد؟
    2- آيا براي ارسال email به شكل مالتي پارت حتما بايد يك نرم افزار خاص مثل Chilkat يا MIME خريداري كرد؟ و يا ميتواند با استفاده از يكسري هدرها يا لايبراري ها اين كار را انجام داد؟

    ممنون از كمكتان

  5. افشار محبی

    با سلام،
    در مورد سوال اول: نمی‌دانم که شما دقیقا از چه روشی استفاده کرده‌اید ولی بنده فایل مورد نظرم را چه word باشد چه عکس چه هر نوع دیگری، با کمک FileStream باز کرده و تمام محتویات آن را بایت به بایت خوانده و در داخل یک List از نوع byte می‌ریزم. سپس آن را با متود Convert.ToBase64String به Base64 تبدیل می‌کنم. بعد از همه این کارها ContentType را هم بسته به نوع فایل به یکی از انواع مشروحه در پروتکل تنظیم کرده و آن را در داخل XML نهایی قرار می‌دهم. البته ممکن است مشکل شما در خواندن و نمایش XML باشد نه در تولید آن.
    در مورد سوال دوم: ما که هیچ چیز خاصی برای ارسال ایمیل نخریدیم حتی از crack شده چیزی هم استفاده نکردیم. یک نمونه Open Source در سایت CodeProject پیدا کردیم و همه کارهایمان را با آن انجام دادیم که به شکر خدا تا حالا مشکل خاصی از این ناحیه نداشته‌ایم. اسم این کامپوننت MimeClient است.

    من لیست کوچکی از افراد درگیر با توسعه «پروتکل تبادل الکترونیک مکاتبات، ECE» تهیه کرده‌ام. بعدا می‌توانیم با کمک این افراد نرم افزارهایمان را راحت‌تر تست کنیم و به مشکلات یکدیگر کمک کنیم. آیا اجازه می‌دهید اسم شما هم به عنوان یک توسعه دهنده به این لیست اضافه شود؟ در صورت مثبت بودن جواب، ایمیل خودتان را برای بنده بفرستید یا در اینجا بگذارید. ایمیل من afshar dot mohebbi atsign gmail dot com است.

  6. ٍEftekhari

    با سلام و ممنون از راهنمايي شما
    ولي من دقيقا كار شما را براي تبديل يك فايل متني به Base64 string انجام ميدهم و در نوشتن و تبديل آن مشكل ندارم .
    مشكل من دقيقا در قسمت خواندن اين رشته و ريختن در يك Filestream يا StreamWriter ميباشد .
    من حتي يك object از نوع Memory را هم امتحان كردم . و حتي يك فايل ورد ساختم و رشته را Append كردم .
    در تمام اين حالتها همراه متن اصلي يكسري كاراكترهاي عجيب غريب در ورد نشان ميدهد .
    حال سوال من اين است كه آيا غير از عكس كاري كه در Encode انجام ميدهيم و لحاظ Unicode‌آن كار ديگري انجام ميدهيد؟
    آيا فايل خروجي را به همان اسم و فرمت ذخيره ميكنيد؟
    وقتي فايل ورودي يا ذخيره شده از نوع Text است يعني با پسوند TXT مشكلي ندارم ولي بمحض اينكه ورد يا Pdf ميشود به هم ميريزد.

  7. افشار محبی

    من دقیقا از این کد استفاده می‌کنم:
    byte[] binFile = Convert.FromBase64String(oa._OA);
    FileStream fs = new FileStream(filePath, FileMode.CreateNew, FileAccess.Write);
    CallTrace(“Saving file to the disk…”);
    fs.Write(binFile, 0, binFile.Length);
    fs.Flush();
    fs.Close();

    ما پروتکل را عمدتا با استفاده از فایل‌های عکس امتحان کردیم و نمی‌دانم که آیا ممکن است با فایل‌های word یا pdf مشکل پیدا کند یا نه.
    در مورد یونیکد به غیر از خود فایل XML جای دیگری را دستکاری نکردیم. البته فکر نمی‌کنم یونیکد بودن یا نبودن مسئله خیلی عجیب و غیر قابل حلی را به وجود آورد.
    برای نام گذاری فایل‌ها به خاطر سیستم دبیرخانه خودمان آن را با یک نام random خیلی طولانی ذخیره می‌کنم و باز هم مشکلی از این بابت پیش نیامده است.

  8. eftekhari

    با سلام
    من فعلا تونستم يك ايميل حاوي Xml با هدر مشخص به يك ميل سرور بفرستم و در مقصد آن را با هدر مشخص تشخيص دهم .
    ولي حالا كه درگير مديريت مراسلات شدم چند سوال برايم پيش آمده است .

    1- آيا شما Xml هاي ارسالي را با يك نام مشخص ميفرستيد و در مقصد در فهرست هاي متفاوت ذخيره ميكنيد و يا نام Xml شما براساس هر نامه متفاوت است ؟ (آيا در تعريف پروتكل چيزي ذكر شده؟ من پيدا نكردم .)

    2- بديهي است صفحه مديريت مراسلات را طبعا همه نرم افزارهاي دبيرخانه بايد داشته باشند و در زبان C# بنظر ميرسد بايد از گريد براي نمايش نامه هاي خوانده نشده استفاده شود . حال سوال من اين است در صورت استفاده از گريد آيا خواندن نامه ها بشكل Batch و استخراج فيلدهاي فرستنده و گيرنده ، شماره نامه و موضوع زمان بر نيست ؟ چه interface پيشنهاد ميكنيد ؟ جداول اطلاعاتي واسط براي ارسال و دريافت ؟

    3- آيا شماره نامه ذكر شده در Xml همان شماره اصلي حك شده روي نامه است يا شماره اي كه نرم افزار دبيرخانه طرف مقابل ما آنرا ثبت ميكند؟

    4- بنظرم رسيد نامه بايد دقيقا در زمان ذخيره نامه در جدول اطلاعاتي خودمان ارسال شود . درست است ؟

    5- آيا ميتوان يكطرفه يك Webservice نوشت كه بشكل Online نامه را در سيستم ما پس از ثبت در سيستم مقابل ذخيره نمايد ؟ سيستم مقابل با Java كار ميكند .

    ممنون از توجه شما

  9. افشار محبی

    ۱- من هم در پروتکل به چنین موضوعی برخورد نکردم و دیده‌ام که هر کدام از شرکت‌ها بنا به سلیقه خودشان یک اسم دلخواه برای «ایکس ام ال» حاوی نامه پروتکلی در نظر گرفته‌اند.
    ۲- ما هم برای نمایش نامه‌های پروتکلی وارده از ساختار جدولی استفاده می‌کنیم و هر بار که ایمیلی به عنوان نامه پروتکلی وارد سیستم می‌شود آن را از ایمیل‌ها حذف می‌کنیم. البته هر چقدر که جلوتر می‌رویم بیشتر متوجه می‌شویم که این ساختار چندان مناسب نیست در نتیجه ما هم در جستجوی جایگزینی بهتر هستیم.
    ۳- اگر اشتباه نکنم این شماره‌ای است که توسط دبیرخانه ارسال کننده به نامه اختصاص داده است. یعنی دبیرخانه طرف مقابل نامه مورد نظر را با این شماره می‌شناسد. این استنباط بنده است ولی بهتر است با دبیرخانه آن طرف خط خودتان هم هماهنگی کنید.
    ۴- ما با این موضوع سلیقه‌ای برخورد کرده‌ایم. یعنی اجازه می‌دهیم کاربر هر تعداد نامه که دلش خواست ثبت کند و بعدا بعضی از آنها را برای ارسال از طریق پروتکل ECE انتخاب کند.
    ۵- یعنی این که سیستم مقابل شما به جای این که برای شما ایمیل بفرستد، وب سرویس شما را اجرا کرده و از آن طریق نامه را در دیتابیس شما ثبت کند؟ این طوری هم می‌شود ولی دیگر نمی‌شود به آن پروتکل گفت!

  10. افشار محبی

    برای هر نامه یک اسم منحصر به فرد (مثلا بر اساس آی دی دیتابیسی نامه) و همگی در بدو ورود به سیستم در شاخه «الف» ذخیره شده و بعد از پردازش و ثبت در بانک اطلاعاتی به شاخه «ب» (به عنوان شاخه بایگانی) منتقل می‌شوند. این روش من است.

  11. Eftekhari

    با سلام و خسته نباشيد .
    امكان اين مسئله وجود دارد كه من يك Email تستي از داخل برنامه با Xml و فرمت و هدر پروتكل براي شما بفرستم و ببينيد كه آيا درست فرستاده شده يا خير؟ منظورم تست است .

  12. Eftekhari

    با سلام

    باز يك سوال ديگر
    براي ارسال نامه هاي صادره به دبيرخانه شركت ديگري در محيط دات نت در يك گريد اقدام به ساخت فايل Xml كرده و همان جا آنرا به ميل سرور ارسال ميكنم
    حال يك مشكل دارم
    اولين بار كه فايل xml من ساخته ميشود هيچ مشكلي ندارد و آنرا ارسال ميكند دفعه دوم كه ميخواهد بررسي كند كه اگر فايل وجود دارد آنرا حذف كرده و يك فايل جديد با Streamwriter درست كند پيغام ميدهد كه :
    The process cannot access the file ‘D:_WebSite….FilesSendXMLECE_ATTRIBUTE.XML’ because it is being used by another process.
    و كد نوشته شده هم هست :

    /*===========================find the record which selected and get other fields of this record for replacing in the xml output file ===*/
    string StMainTemp = MyRead4TempFile(Server.MapPath(“\Files\SendXML\Main\ECE_SEND.XML”);
    /*===========================save as main file in other director by other name (which specify in NvaredeFile) ====*/
    if (File.Exists(Server.MapPath(“\Files\SendXML\ECE_ATTRIBUTE.XML”)))
    {
    //****اگر فايل مورد نظر وجود دارد آنرا پاك كرده و جايگزين نمايد سپس ادامه عمليات
    File.Delete(Server.MapPath(“\Files\SendXML\ECE_ATTRIBUTE.XML”));
    }
    StreamWriter stmW = new StreamWriter(Server.MapPath(“\Files\SendXML\ECE_ATTRIBUTE.XML”),false,System.Text.UTF8Encoding.UTF8);
    /*===========================Replace some fields of selected record which specify in grid view ====*/

    StMainTemp = StMainTemp.Replace(“@@DSender”, DSEmailNSadere.Tables[0].Rows[0][“SenderDep”].ToString());
    StMainTemp = StMainTemp.Replace(“@@Sender”, DSEmailNSadere.Tables[0].Rows[0][“SenderName”].ToString());
    StMainTemp = StMainTemp.Replace(“@@OSender”, DSEmailNSadere.Tables[0].Rows[0][“SenderOrg”].ToString());
    .
    .
    .
    .
    .

    stmW.Write(StMainTemp);

    }
    StMainTemp = “”;
    stmW.Flush();
    stmW.Close();
    stmW.Dispose();
    stmW = null;
    string Requestbody = “”;
    SendSmtpMail(“….”, “….”, “….”, “…”, “…”, “iran.ir–(ECETest)–“, Requestbody);

  13. Eftekhari

    البته ذكر كنم تا زماني كه IE من بسته نشده حتي از پشت برنامه هم قادر به پاك كردن فايل از فولدر ذكر شده نيستم ولي وقتي IE را مي بندم ميتوانم آنرا حذف نمايم .!
    دقت كردم حتما Streamwriter را Close و Dispose كنم .

  14. Eftekhari

    البته يك راه وجود دارد و آنهم اينكه فايل Xml ايجاد شده هر دفعه يك فايل با اسم Random ايجاد كند ولي براي اينكه درگير مديريت فايل هاي Xml ارسالي در روي سرور نشوم ترجيج ميدهم هميشه يك فايل با يك اسم خاص را توليد كند .

  15. افشار محبی

    من هم چنین مشکلی با برنامه‌های وبی دارم و متاسفانه راه حل درست آن را بلد نیستم به همین خاطر دقیقا از همان راه «اسم اتفاقی» استفاده می‌کنم و هر بار فایلم را به یک اسم منحصر به فرد مثل ECEProtocolFile.xml.0d3c86fa-357b-430d-bab4-1bb1d38c679c استفاده می‌کنم!

  16. Eftekhari

    با سلام

    برنامه ارسال و دريافت ايميل من تمام شده و آن را نصب كردم و با ايميل و ميل سرور اينترنتي هم چك كردم كه مشكلي نداشت ولي در محيط مشتري در هنگام دريافت ايميل يعني وقتي با POP3 كار ميكند و يك ايميل اكانت داخلي اين پيغام را ميدهد .

    Mail server …..com doesn't accept Password x for user x
    Massage :-Err maildrop already locked
    آيا تا بحال برخورد كرده ايد ؟
    چكار كنم ؟
    با Telnet هم وقتي وصل ميشوم بازهم پيغامي مبني بر لاك شدن پسورد اين اكانت ميدهد
    ميل سرور MDemoun است و يكبار هم آنرا Restart كردم بازهم تاثيري نداشته است . ضمنا با اين اكانت با Outlook وصل ميشوم و مشكلي ندارم
    و SSL هم ندارند!!!
    واقعا كلافه شدم …

  17. افشار محبی

    واقعا با Outlook هیچ مشکلی در ارسال و دریافت به/از این ایمیل داخلی نداری؟ در Outlook چه چیزی تنظیم شده؟ فقط server name و user/password یا چیز دیگری هم بوده؟ یک بار هم سعی کن با Mozilla Thunderbird امتحان کنی.

    (پوزش بابت تاخیر خیلی زیاد در جواب‌گویی)

  18. Eftekhari

    حل شد . خوب مسئله اين بود كه چون يك مشكلي تو ايجاد يك فايل پد بمناسبت رسيدن به يك WildCharacter ايجاد ميشد ، فانكشن كانكت به ميل سرور دوبار صدا ميشد و چون Timeout آن تمام نشده بود اكانت را لاك ميكرد . يعني مشكل واقعا اون مسئله نبود .

  19. ناشناس

    سلام
    راستش من می خوام یک نمونه کار داشته باشم که چطور فیلدهای نامه هامو تبدیل کنم به xml
    و سپس ارسال کنم روند کلی می خوام لطفا

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *