मैं थोड़ा सा जोड़ना चाहता हूं। काम करने लगते एकमात्र दृष्टिकोण Response.IsClientConnected की जांच कर रहा है। यहाँ कुछ तकनीकी क्या मंच के पीछे जा रहा है के बारे में विवरण: here और here यह दृष्टिकोण कुछ खामियां हैं: केवल आईआईएस (कोई आत्म होस्टिंग, कोई देव सर्वर) के तहत
- काम करता है,
- कुछ SO उत्तरों के अनुसार धीमा हो सकता है (क्लाइंट डिस्कनेक्ट होने के तुरंत बाद प्रतिक्रिया न करें): here; here
अंत में मैं CancellationToken सुई कोड का निम्न भाग वेब एपीआई नियंत्रक में IsClientConnected के आधार पर के साथ आया था:
public class ConnectionAbortTokenAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
private readonly string _paramName;
private Timer _timer;
private CancellationTokenSource _tokenSource;
private CancellationToken _token;
public ConnectionAbortTokenAttribute(string paramName)
{
_paramName = paramName;
}
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
object value;
if (!actionContext.ActionArguments.TryGetValue(_paramName, out value))
{
// no args with defined name found
base.OnActionExecuting(actionContext);
return;
}
var context = HttpContext.Current;
if (context == null)
{
// consider the self-hosting case (?)
base.OnActionExecuting(actionContext);
return;
}
_tokenSource = new CancellationTokenSource();
_token = _tokenSource.Token;
// inject
actionContext.ActionArguments[_paramName] = _token;
// stop timer on client disconnect
_token.Register(() => _timer.Dispose());
_timer = new Timer
(
state =>
{
if (!context.Response.IsClientConnected)
{
_tokenSource.Cancel();
}
}, null, 0, 1000 // check each second. Opts: make configurable; increase/decrease.
);
base.OnActionExecuting(actionContext);
}
/*
* Is this guaranteed to be called?
*
*
*/
public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)
{
if(_timer != null)
_timer.Dispose();
if(_tokenSource != null)
_tokenSource.Dispose();
base.OnActionExecuted(actionExecutedContext);
}
}
स्रोत
2012-03-19 15:43:07
इस के लिए
का उल्लेख कर सकते, ASP.NET MVC ढेर से हो रहा है ASP.NET से नहीं एमवीसी वेब एपीआई। गलत होने पर मुझे सही करें। –
यह कोर एएसपी.Net इंजन से है। केवल आईआईएस एकीकरण पाइपलाइन के साथ काम करता है (वीएस डीबग मोड नहीं)। एमएसडीएन में एक अच्छा प्रलेखन शामिल है: http://msdn.microsoft.com/en-us/library/system.web.httpresponse.isclientconnected.aspx –
सुझाव के लिए धन्यवाद। यह एकमात्र विकल्प प्रतीत होता है, मैं शायद इस पर आधार बनाने का समाधान तैयार करूंगा। –