WCF хочет внедрить обновление прогресса клиента - PullRequest
0 голосов
/ 15 февраля 2011

У меня есть дуплексная служба WCF, к которой клиенты подключаются и ждут команд.Структура приложения следующая.

GUI (Asp.net) ------------> Служба WCF ------------------> WCF Client

На страницах Asp.net вы можете запустить модульные тесты Gallio / MB.Они передаются в Службу, и служба просит клиентов выполнить тесты.Все работает хорошо.Теперь я хочу обновить приложение Asp.net со статусом теста.

Поэтому, если пользователь хочет запустить хотя бы целую сборку тестов, я должен знать об этом в приложении Asp.NETкакой тест запущен и, возможно, процент от выполненного теста.

Любая помощь в том, как поступить с этим / какой подход использовать, очень ценится.

Спасибо

Ответы [ 2 ]

2 голосов
/ 15 февраля 2011

Ошибка SOAP - это механизм передачи ошибки или состояния ошибки от сервиса к потребителю. Спецификация SOAP включает определение сбоев SOAP, предоставляя структуру для содержимого тела сообщения при возникновении ошибок. Это позволяет всем различным стекам SOAP выдавать ошибки стандартным способом.

FaultException Используется для отправки нетипизированных данных об ошибках обратно потребителю.

FaultException<TDetail> Универсальная версия, используемая для отправки типизированных данных об ошибках обратно клиенту, где TDetail представляет параметр типа для подробной информации о сбоях, которая должна быть сериализована обратно потребителю как часть сбоя SOAP сообщение.

FaultContractAttribute FaultContractAttribute, также определенный в System.ServiceModel, позволяет разработчику службы объявлять, какие сбои может возникнуть у данной операции службы, если что-то пойдет не так. Ниже приведены ключевые сведения, относящиеся к работе с атрибутом FaultContractAttribute:

Атрибут может применяться только к операциям.
Атрибут не наследуется.
Атрибут может применяться несколько раз; Например, если ваша сервисная операция может возвращать различные типы ошибок, у вас будет объявление FaultContractAttribute для каждого типа ошибок.

Конструктор атрибута принимает объект Type, используемый для ссылки на тип .NET объекта Detail, то есть тип сведений о сбое, которые вы хотите связать со своими сбоями.

[ServiceContract()]
public interface ICalculatorService{
[OperationContract()]
[FaultContract(typeof(string))]
double Divide(double numerator, double denominator);
}
public class CalculatorService : ICalculatorService {
public double Divide(double numerator, double denominator) {
if (denominator == 0.0d) {
string faultDetail = "You cannot divide by zero";
throw new FaultException<string>(faultDetail);
}
return numerator / denominator;
}
}

* Обратите внимание, что вместо строкового класса в этом примере вы можете определить свой собственный класс исключений.

2 голосов
/ 15 февраля 2011

Вам необходимо определить контракт обратного вызова и реализовать его на своем веб-сайте ASP.Net.Вам также необходимо использовать wsDualHttpBinding для добавления поддержки дуплексных операций.

public interface ITransferAck{
    [OperationContract(IsOneWay = true)]
    void TransferRecordResendRequest(int transferId); 
}
[ServiceContract(CallbackContract=typeof(ITransferAck))]
public interface IBankTransfer{
    [OperationContract(IsOneWay=true)]
    void ExchangeTransferRecord(int transferId, string record);
}

Служба связывается с клиентским приложением через ссылку на прокси, полученную из OperationContext, как показывают следующие примеры кода.

client = OperationContext.Current.GetCallbackChannel<ITransferAck>(); 

client.TransferRecordResendRequest(1); 
...