Я думаю, что вам, вероятно, понадобится «опрос дуплексного http-сервиса» - это означает, что WCF подделает для вас сервис дуплексного стиля (путем опроса).Преимущество дуплексного сервиса по сравнению с обычным асинхронным сервисом заключается в том, что его легко перезванивать клиенту несколько раз (поэтому вы можете предоставить отзыв о ходе выполнения вашей задачи).
Это очень легко реализовать,Допустим, у вас есть два проекта: веб-приложение и приложение silverlight ...
Веб-приложение
Создайте свой сервис, например:
[ServiceContract(CallbackContract = typeof(ICallback))]
public interface ILongRunningService
{
[OperationContract]
void StartLongRunningProcess(string initialParameter);
}
[ServiceContract]
public interface ICallback
{
[OperationContract(IsOneWay = true)]
void Update(string someStateInfo);
}
public class LongRunningService : ILongRunningService
{
public void StartLongRunningProcess(string initialParameter)
{
// Get hold of the callback channel and call it once a second
// five times - you can do anything here - create a thread,
// start a timer, whatever, you just need to get the callback
// channel so that you have some way of contacting the client
// when you want to update it
var callback = OperationContext
.Current
.GetCallbackChannel<ICallback>();
ThreadPool
.QueueUserWorkItem(o =>
{
for (int i = 0; i < 5; i++)
{
callback.Update("Step " + i);
Thread.Sleep(1000);
}
});
}
}
Затем вам понадобитсяФайл SVC, в котором есть это (настройте атрибут service, чтобы он был классом реализации вашего сервиса):
<%@ ServiceHost Service="SilverlightApplication.Web.LongRunningService" %>
Наконец, вам понадобится эта конфигурация внутри web.config (это идет внутри корневого элемента конфигурации):
<system.serviceModel>
<extensions>
<bindingExtensions>
<add name=
"pollingDuplexHttpBinding"
type="System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement,System.ServiceModel.PollingDuplex, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</bindingExtensions>
</extensions>
<services>
<service name="SilverlightApplication.Web.LongRunningService">
<endpoint
address=""
binding="pollingDuplexHttpBinding"
bindingConfiguration="multipleMessagesPerPollPollingDuplexHttpBinding"
contract="SilverlightApplication.Web.ILongRunningService">
</endpoint>
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"/>
</service>
</services>
<bindings>
<pollingDuplexHttpBinding>
<binding name="multipleMessagesPerPollPollingDuplexHttpBinding"
duplexMode="MultipleMessagesPerPoll"
maxOutputDelay="00:00:07"/>
</pollingDuplexHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
Важными частями являются атрибут name в элементе service и атрибут contract в конечной точке элемент.Это должны быть класс и интерфейс, который вы определили (с пространством имен).
ВАЖНО Необходимо добавить ссылку на C: \ Program Files (x86) \ Microsoft SDKs \ Silverlight \v4.0 \ Libraries \ Сервер \ System.ServiceModel.PollingDuplex.dll сборка (удалить 64-разрядную ОС, если не 64-разрядную) для проекта веб-приложения.
Приложение Silverlight
Сначала необходимо добавить ссылку на службу в созданную вами службу, а затем, скажем, вы хотите вызвать службу с помощью кнопки, у вас будет следующий код:
private void button1_Click(object sender, RoutedEventArgs e)
{
// Create the client proxy with the URL of the service
var proxy = new LongRunningServiceClient(
new PollingDuplexHttpBinding(
PollingDuplexMode.MultipleMessagesPerPoll),
new EndpointAddress(
"http://localhost/WebApplication/LongRunningService.svc"));
// Attach the handler to be called periodically and start the process
proxy.UpdateReceived += Update;
proxy.StartLongRunningProcessAsync("blah");
}
private void Update(object sender, UpdateReceivedEventArgs e)
{
// Use the result from the e parameter here
}
ВАЖНО Вам необходимо добавить ссылку на C: \ Program Files (x86) \ Microsoft SDKs \ Silverlight \ v4.0 \ Libraries \ Клиент \ System.ServiceModel.PollingDuplex.dll (удалить x86).если не 64-битная ОС) к клиентскому проекту Silverlight.
И это все - метод Update будет вызываться, в данном случае один раз в секунду пять раз.но вы можете делать все что угодно.