PDA

View Full Version : سوال: مشکل در ارسال byte[] به WCF



mohsen.r
جمعه 14 آبان 1389, 00:52 صبح
سلام خدمت همه دوستان
من یک عکس رو از کاربر گرفته و اون رو تبدیل به byte[] می کنم، ولی وقتی که میخوام اون رو به صورت پارامتر به WCF بفرستم با پیام خطای زیر مواجه میشم:
The remote server returned an error: NotFound

البته web.config رو هم تغییردادم ولی درست نشد و باز هم همون خطا رو میده.
لطفا اگه امکان داره یه برنامه که این کارو انجام میده رو اینجا بزارید.

با عرض معذرت خیلی عجله دارم اگه امکان داره سریع این کارو انجام بدید.:خجالت:

mahdi7s
جمعه 14 آبان 1389, 09:26 صبح
با سلام
اررور فوق یعنی سرویس شما یک مشکلی دارد و قبل از اینکه بخواهد اطلاعات را به کلاینت ارسال کند به خطا برخورد می کند و سرور به حالت Faulted می رود...
آیا خود سرویس را جداگانه امتحان کردید؟
پس اعمال تغییرات در سرور مرجع آن در کلاینت را Update کردید؟
نهایتا کد سرویس و contract ها و فایل پیکربندیتان(لزوما تگ system.serviceModel) را قرار دهید تا زودتر به جواب برسید.

موفق باشید

mohsen.r
جمعه 14 آبان 1389, 11:26 صبح
با سلام
به نظر نمیاد از سرویس باشه چون وقتی یه پارامتر از نوع String می فرستم مشکلی نداره
تو این برنامه فقط زمانی این Error رو میده که بخوام پارامتری از نوع Byte[] به وب سرویس ارسال کنم.
البته چندجا خوندم که باید تنظیمات web.config رو تغییر بدم. من هم اون مراحلی رو که لازم بود انجام دادم ولی باز هم به همین خطا برخورد می کنم.
اگر شما قبلا این کارو انجام دادید لطفا یه Source Code برام بزارید.


با تشکر

mahdi7s
جمعه 14 آبان 1389, 12:54 عصر
شما پارامتر String را با یک آرایه ی byte مقایسه می کنید؟! و اگر کمی حجم اطلاعات بالا رود بهتر است از روش Streaming (http://msdn.microsoft.com/en-us/library/ms733742.aspx)استفاده کنید!
متاسفانه چندان وقت ندارم سمپلی بگذارم.

موفق باشید

taghvajou
جمعه 14 آبان 1389, 14:30 عصر
سلام به همه
محسن یه نمونه کد ساده واستون نوشتم و گذاشتم. همین رو اجرا کن و اگه باز هم به مشکل برخوردی، یه تصویر از خطای بذار تا ببینینم مشکل از کجاست!

mohsen.r
شنبه 15 آبان 1389, 22:03 عصر
با سلام خدمت همه دوستان
از کمکتون خیلی ممنونم
ولی متاسفانه نمونه برنامه شما هم همون مشکل رو داره و Error میده.
البته من خودم تونستم این مشکل رو حل کنم. و نمونه کد رو هم گذاشتم.


با تشکر

taghvajou
شنبه 15 آبان 1389, 22:11 عصر
سلام به همه
1- میشه لطف کنی اصل خطا رو هم بذارین
2- کد رو یه بار هم با عکسی با حجم پایین تر امتحان کنین و نتیجه اش رو هم بفرمایین
3- مشکلی که پیدا کردین چی بود؟ و چه جوری حلش کردین؟
4- نمونه کد رو کجا گذاشتین؟
5- با تشکرت

mohsen.r
شنبه 15 آبان 1389, 23:09 عصر
سلام
آقای تقوی جو کدی که قبلا نوشته بودم و با خطا مواجه شده بود شبیه نمونه کد شما بود و با هر عکسی حتی عکس با حجم 10کیلو بایت هم Error میداد. این فایل ضمیمه هم نتیجه اجرای برنامه شما هست، که در هنگام آپلود عکس با حجم 20 کیلوبایت رخ داد.

taghvajou
یک شنبه 16 آبان 1389, 09:45 صبح
سلام به همه
محسن جان! قضیه پیچیده شد؟!؟!؟
مشتاق شدم که این مسئله رو حتما و دقیقا بشناسیم.
من کد خودم رو از یه کامپیوتر دیگه دانلود کردم و اونجا هم امتحان کردم.(تصاویر ضمیمه)
شما مشکل رو تو کجا پیدا کردی؟ چی بود؟ چی شد؟ چی کار کردی که رفع شد؟ یه کم توضیح بده! (اشاره به سوال سوم پست شما 7 همین تاپیک)

mohsen.r
یک شنبه 16 آبان 1389, 21:16 عصر
سلام خدمت همه دوستان
آقای تقوی جوی عزیز لینک سایتی رو که نمونه پروژه رو داره براتون گذاشتم.
http://www.silverlightchina.net/html/developer/silverlight/2010/1017/2702.html (http://www.silverlightchina.net/html/developer/silverlight/2010/1017/2702.html)

sia_2007
دوشنبه 17 آبان 1389, 20:36 عصر
بابا اینجا چه خبره
اونی که شما نشون میدی Exception اصلی نیست
اول IncludeFaultExpection رو برابر True قرار بدین
بعد اگه سرور رو IIS هاست شده؛ Debug رو Enable کنین
بعد اون Exception اصلی رو نشون بدین !

sia_2007
دوشنبه 17 آبان 1389, 20:42 عصر
<compilation debug="true" targetFramework="4.0" />
</system.web>

<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />

sia_2007
دوشنبه 17 آبان 1389, 20:57 عصر
در ضمن Start Mode خود Solution رو بذارین رو Multiple ؛ و بعدش بگین اول Service رو اجرا کنه و بعد کلاینت رو
هر دو رو هم تو مد Debug
البته من خطایی نگرفتم؛ که به شما نشون بدم

akoroorian
دوشنبه 18 بهمن 1389, 17:51 عصر
ممکنه خیلی دیر شده باشه، ولی برای اونای دیگه ای که دنبال جوابشون میان اینجا میزارم.
من هم مشکل مشابه ای داشتم که بخاطر اندازه زیاد آرایه بایتی که میخواستم ارسال کنم همین پیغام رو میداد.
اینجا جوابشو پیدا کردم.
http://forums.silverlight.net/forums/t/189294.aspx
امیدوارم بدرد خورده باشه.

taghvajou
دوشنبه 18 بهمن 1389, 21:10 عصر
سلام به همه
ممنون از اینکه حتی دیدین که یه تاپیک کهنه شده ولی باز هم تجربه تون رو انتقال میدین. با اجازه تون من یه کمی کاملتر کنم.

مطلبی که شما بهش اشاره کردین خیلی مفید بود. ممنون

میخوام تکمیل تر کنم.
شروع از اضافه کردن زمان تایم آوت ارسال، دریافت، باز کردن و بستن سرویسه. یعنی:

<system.serviceModel>
<bindings>
<customBinding>
<binding name="CustomBinding_DMSService" receiveTimeout="00:05:00" sendTimeout="00:05:00" openTimeout="00:05:00" closeTimeout="00:05:00">
<binaryMessageEncoding />
<httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647"/>
</binding>
</customBinding>
</bindings>
این مقادیر رو تو سند تنظیمات کلاینت ارجاعی سرویس (ServiceReferences.ClientConfig) در بخش سیلورلایت پروژه پیدا کرد. (البته بعد از اینکه سرویس به رفرنسهامون اضافه شده).

نکته اول اینکه مقدار بیش از پنج دقیقه اعمال نمیشه. شما هر چه قدر هم عدد بزرگتری بدین سرویس نهایتا همون 5 دقیقه رو در نظرمیگیره. چراش رو نمیدونم (منبع: داکیومنت مایکروسافت - تجربه و آزمون خطای شخصی)
عکس شماره یک:
66064
نکته دوم:

مشکل انتقال اطلاعات حجیم رو فقط با زیاد کردن مدت زمان تایم آوت نمیشه رفع کرد چون گاهی بسته ای که فرستاده میشه خودش بزرگه! مثلا شما حالتی رو در نظر بگیرین که یه کالکشن دارین که اطلاعات 5000 تا کاربر رو تو اون میخواین انتقال بدین.
اینجا موقعی که آبجکتمون (هر چند در قالب یه سند ایکس ام ال) سریالایز میشه و با سرویس فرستاده میشه به طرف کلاینت ولی اگه این آبجکت بزرگ باشه باز هم به مشکل برمیخورین.

یه نگاهی به جزئیاتی که از سند سرویس رفرنس براتون دادم بکنید. یه مقدار 2147483647 بایتی برای حجم بیشینه پیام نوشته شده تو
maxReceivedMessageSize="2147483647" maxBufferSize="2147483647"

لازمش اینکه تو سند تنظیمات بخش وب هم یه تغییر داده بشه، یعنی تو سند Web.config تو پروژه وب سالوشن که این مقدار به عنوان حجم قراردادی شی انتقالی تعریف بشه:


<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<customBinding>
پس کافیه که یه خط به وب کانفیگ اضافه بشه :<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
به عکس زیر توجه فرمایین:
66065

نکته موجود تو اون تاپیک که دوستمون اشاره کردن تو آرای ها جواب میده و برای اشیا صادق نیست که در اون صورت در کار با یه لیست ( همون یه شی از کلاس آبزروال کالکشن تو سیلورلایت) باز هم مشکل به قوت خود باقی می مونه

امیدوارم که توضیحات تکمیلی مفید بوده باشه. التماس دعا

Sahar.Sari
یک شنبه 28 خرداد 1396, 10:39 صبح
با اینکه قدیمی بود استفاده کردم ممنون