PDA

View Full Version : مشکل در برقراری ارتباط با وب سرویس



OlympicTelecom
یک شنبه 21 آبان 1385, 21:01 عصر
یک وب سرویس دارم و یک web application که هر دو با vb.net نوشته شدند . هر دو هم میشه گفت تقریبا روی یک lan هستند و هیچ مشکل ارتباطی بینشون نیست اما گاهی اوقات که web application می خواد اطلاعات به وب سرویس ارسال کنه این خطا بوجود میاد:


The underlying connection was closed: A connection that was expected to be kept alive was closed by the server.


بعضی مواقع هم درست کار می کنه نظم و منطق خاصی هم نداره و کاملا رندم خطا میده
ممنون از راهنمایی دوستان

Behrouz_Rad
دوشنبه 22 آبان 1385, 00:12 صبح
با ایجاد هر درخواست به سرور یک Connection برای وب سرویس در نظر گرفته میشه.
اگر زمان پردازش درخواست توسط سرور طولانی بشه و یا تعداد درخواست ها در یک زمان زیاد باشه و سرور نتونه به هر دلیلی به همه ی اونها پاسخ بده، Connection جاری همچنان تا مدت زمانی خاص باز می مونه تا اینکه سرور بنا به تشخیص خودش اون رو ببنده و به درخواست های دیگه برسه!
هر وب سرویس در یک زمان تنها می تونه به یک درخواست رسیدگی کنه. در کلاس HttpWebRequest، خاصیتی با نام ConnectionGroupName وجود داره که می تونه یک یا چند Connection رو تحت یک نام و در یک گروه قرار بده.
اگر این خاصیت رو برابر با یک مقدار Random قرار بدی، هر Connection در یک گروه جداگانه قرار میگیره؛ در نتیجه این توانایی برای وب سرویس به وجود میاد که Connection های متعددی رو در یک زمان، پاسخگو باشه.
پس خاصیت ConnectionGroupName شی ایجاد شده از کلاس HttpWebRequest رو برابر با یک مقدار راندوم بگذار.
مثلا می تونی از متد NewGuid کلاس Guid استفاده کنی:


myHttpWebRequest.ConnectionGroupName = Guid.NewGuid().ToString();

توجه داشته باش که حداکثر میزان مجاز Connection ها برای ایجاد به طور پیش فرض 10 عدد هست.

موفق باشید.

OlympicTelecom
چهارشنبه 24 آبان 1385, 10:31 صبح
درست نشد !!

این خط چیکار می کنه؟
myhttpwebrequest.keepalive=false
??

ممنون

Behrouz_Rad
چهارشنبه 24 آبان 1385, 20:30 عصر
پس احتمالا مشکل از Timeout شدن Connection هست!
مقدار KeepAlive رو تغییر نده.
KeepAlive به طور پیش فرض، True هست! نیازی به تغییر اون نداری...
Keep-Alive یک Http-Header هست که "اتصال پایا" رو بین کلاینت و وب سرور برقرار می کنه.
این اتصال پایا تا "یک دقیقه" باقی می مونه. البته اگر در این فاصله درخواست جدیدی از جانب Client ارسال بشه، این زمان "ریست" میشه.
در صورتی که اون زمانِ یک دقیقه، کمتر از یک دقیقه تعیین بشه، احتمالا با همون خطایی که نوشتی مواجه میشی!
از اونجایی که این ارتباط، یک ارتباط دو طرفه است، هم کلاینت و هم سرور می تونن KeepAliveTimeout متفاوتی داشته باشن.
در این حالت، زمان KeepAliveTimeout سرور، ارجحیت خواهد داشت!
این زمان در رجیستری قابل تغییر هست. ادمین باید سعی کنه این مقدار رو بیشتر از 2 دقیقه تعیین نکنه چون در این صورت، جریان به شکل دیگه ای رقم می خوره!

موفق باشید.

OlympicTelecom
شنبه 27 آبان 1385, 01:26 صبح
میشه بیشتر توضیح بدید یا یک منبع معرفی کنید.
من کمی سرچ کردم به این رسیدم :

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=209544&SiteID=1&PageID=0
(http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=209544&SiteID=1&PageID=0)
اما نفهمیدم یعنی چی ؟؟!!

این دستوری که شما گفتید رو هم وقتی میزنم :

dim MyRequest as system.net.httpwebrequest
myrequest.connectiongroupname=...

اما موقع اجرا این خطا رو میده :


.Web.Services.Protocols.SoapException: System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.NullReferenceException: Object reference not set to an instance of an object.

Behrouz_Rad
شنبه 27 آبان 1385, 08:09 صبح
تلفیقی از 2 توضیحات پست قبلی:


System.Net.ServicePointManager.Expect100Continue = False

البه یک نفر هم مشکلش به شکل زیر حل شده:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=269078&SiteID=1

موفق باشید.