1) برنامه SignalR در IE کار نمیکند.
پردازشگر json، در نگارشهای اخیر IE به آن اضافه شده است. برای رفع این مشکل در نگارشهای قدیمی، نیاز است از اسکریپت کمکی http://nuget.org/List/Packages/json2 استفاده نمائید. همچنین مرورگر IE را نیز باید وادار ساخت تا بر اساس آخرین موتور پردازشی خود کار کند:
2) هنگام فراخوانی مسیر signalr/hubs پیغام 404 (یافت نشد) دریافت میشود.
برای رفع این مشکل ابتدا اطمینان حاصل کنید که تنظیمات مسیریابی تعریف شده در فایل global.asax.cs موجود هستند.
در ادامه اطمینان حاصل نمائید مسیر اسکریپتهای signalr/hubs به درستی تعریف شدهاند:
برای مثال در برنامههای MVC و وب فرمها تعریف صحیح باید به شکل زیر باشد:
همچنین وجود تنظیمات ذیل را در فایل وب کانفیگ برنامه نیز بررسی کنید:
3) متدهای سمت کلاینت من فراخوانی نمیشوند.
بهترین راه برای مشاهده ریز جرئیات خطاها، ذکر سطر ذیل در کدهای سمت کلاینت جاوا اسکریپتی برنامه است:
و سپس مراجعه به کنسول جاوا اسکریپت مرورگر برای بررسی خطاهای لاگ شده.
4) خطای «Connection must be started before data can be sent» را دریافت میکنم.
همانطور که در قسمت قبل عنوان شد، کلیه فراخوانیهای SignalR از نوع غیرهمزمان هستند. بنابراین باید با استفاده از callback و زمان فراخوانی آنها که عموما پس از برقراری اتصال رخ میدهد، نسبت به انجام امور دلخواه اقدام کرد.
همانطور که در این مثال مشاهده میکنید، سطر proxy.invoke در یک callback فراخوانی شده است و نه بلافاصله در سطری پس از connection.start. هر زمان که اتصال به نحو موفقیت آمیزی برقرار شد، آنگاه متد subscribe در سمت سرور فراخوانی میگردد.
در حالت استفاده بدون پروکسی نیز چنین callbackهایی قابل تعریف هستند:
5) بعد از 10 اتصال به IIS، برنامه متوقف میشود.
این مورد، محدودیت ذاتی IIS 7 نصب شده بر روی ویندوز 7 است. بهتر است از یک IIS کامل موجود در ویندوزهای سرور استفاده کنید. در این سرورها عدد پیش فرض تنظیم شده 5000 اتصال است که در صورت نیاز با استفاده از دستور زیر قابل تغییر است:
به علاوه ASP.NET نیز محدودیت 5000 اتصال به ازای هر CPU را دارد. برای تغییر آن باید به مسیر ذیل مراجعه
و سپس مقدار maxConcurrentRequestsPerCPU را تنظیم کرد:
به علاوه ASP.NET پس از رد شدن از حد maxConcurrentRequestsPerCPU، درخواستها را در صف قرار میدهد. این مورد نیز قابل تنظیم است. ابتدا به مسیر ذیل مراجعه کرده
و سپس در صورت نیاز و لزوم، مقدار requestQueueLimit را تغییر دهید:
پردازشگر json، در نگارشهای اخیر IE به آن اضافه شده است. برای رفع این مشکل در نگارشهای قدیمی، نیاز است از اسکریپت کمکی http://nuget.org/List/Packages/json2 استفاده نمائید. همچنین مرورگر IE را نیز باید وادار ساخت تا بر اساس آخرین موتور پردازشی خود کار کند:
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
2) هنگام فراخوانی مسیر signalr/hubs پیغام 404 (یافت نشد) دریافت میشود.
برای رفع این مشکل ابتدا اطمینان حاصل کنید که تنظیمات مسیریابی تعریف شده در فایل global.asax.cs موجود هستند.
در ادامه اطمینان حاصل نمائید مسیر اسکریپتهای signalr/hubs به درستی تعریف شدهاند:
<script type="text/javascript" src="/signalr/hubs"></script>
MVC: <script type="text/javascript" src="@Url.Content("~/signalr/hubs")"></script> Web forms: <script type="text/javascript" src='<%= ResolveClientUrl("~/signalr/hubs") %>'></script>
<configuration> <system.webServer> <modules runAllManagedModulesForAllRequests="true"> </modules> </system.webServer> </configuration>
3) متدهای سمت کلاینت من فراخوانی نمیشوند.
بهترین راه برای مشاهده ریز جرئیات خطاها، ذکر سطر ذیل در کدهای سمت کلاینت جاوا اسکریپتی برنامه است:
$.connection.hub.logging = true;
4) خطای «Connection must be started before data can be sent» را دریافت میکنم.
همانطور که در قسمت قبل عنوان شد، کلیه فراخوانیهای SignalR از نوع غیرهمزمان هستند. بنابراین باید با استفاده از callback و زمان فراخوانی آنها که عموما پس از برقراری اتصال رخ میدهد، نسبت به انجام امور دلخواه اقدام کرد.
var connection = $.hubConnection('http://localhost:8081/'); proxy = connection.createProxy('collectionhub') connection.start() .done(function () { proxy.invoke('subscribe', 'Product'); $('#messages').append('<li>invoked subscribe</li>'); }) .fail(function () { alert("Could not Connect!"); });
در حالت استفاده بدون پروکسی نیز چنین callbackهایی قابل تعریف هستند:
$.connection.hub.start() .done(function() { myHub.server.SomeFunction(SomeParam) //e.g. a login or init .done(connectionReady); }) .fail(function() { alert("Could not Connect!"); });
5) بعد از 10 اتصال به IIS، برنامه متوقف میشود.
این مورد، محدودیت ذاتی IIS 7 نصب شده بر روی ویندوز 7 است. بهتر است از یک IIS کامل موجود در ویندوزهای سرور استفاده کنید. در این سرورها عدد پیش فرض تنظیم شده 5000 اتصال است که در صورت نیاز با استفاده از دستور زیر قابل تغییر است:
appcmd.exe set config /section:system.webserver/serverRuntime /appConcurrentRequestLimit:100000
%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet.config
<?xml version="1.0" encoding="UTF-8" ?> <configuration> <runtime> <legacyUnhandledExceptionPolicy enabled="false" /> <legacyImpersonationPolicy enabled="true"/> <alwaysFlowImpersonationPolicy enabled="false"/> <SymbolReadingPolicy enabled="1" /> <shadowCopyVerifyByTimestamp enabled="true"/> </runtime> <startup useLegacyV2RuntimeActivationPolicy="true" /> <system.web> <applicationPool maxConcurrentRequestsPerCPU="20000" /> </system.web> </configuration>
%windir%\Microsoft.NET\Framework\v4.0.30319\Config\machine.config
<processModel autoConfig="false" requestQueueLimit="250000" />