Я занимаюсь разработкой службы WCF ( basicHttpBinding WS-привязка ) и ( NetMsmqBinding MSMQ )).Оба они размещены в отдельной службе Windows.Обе службы будут выполнять одинаковую работу, но имеют приоритет.т.е. служба HTTP имеет приоритет, который будет вызываться ( 1st Priority ), и если вызов этого метода на стороне клиента выдает сообщение об исключении (если служба HTTP не работает или не отвечает или выдает ошибку в методе), то же сообщениебудет обработан до конечной точки MSMQ ( 2nd Priority ).
В настоящее время конечные точки HTTP и MSMQ работают нормально.Но я хочу обработать то же сообщение в MSMQ, если оно выдает какую-то ошибку, а это сообщение должно остаться в той же очереди, но оно будет удалено из очереди.Как я могу преодолеть эту ситуацию.Это мой код, который у меня есть сейчас.Я что-то упустил?
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void ProcessToQueue(E.ProcessRequest processRequest, string QueueName)
{
try
{
//This is for testing purpose
throw new Exception("Note: This is for testing if message remains in the queue");
lock (lockObject)
{
MessageQueue messageQueue = new MessageQueue(QueueName);
totalMessages = messageQueue.GetAllMessages();
if (totalMessages.Length > 0)
{
Logger.Logger.Instance.WriteEventLog(string.Concat("AlertFileUploadService.Queue >> Total messages remaining in queue ", QueueName, " : ", totalMessages.Length), LogType.Default);
}
if (processRequest != null && processRequest.AlertId != 1 && processRequest.Key != "Testing")
{
E.ProcessToQueue processToQueue = FillProcessQueue(processRequest);
Logger.Logger.Instance.WriteEventLog(string.Concat("AlertFileUploadService.Queue >> Upload process started..."), LogType.Default);
Stopwatch stopwatch = Stopwatch.StartNew();
//Process to S3 server
E.UploadFileResponse response = M.MessageProcessor.ProcessToS3Server(processToQueue);
Logger.Logger.Instance.WriteEventLog(string.Concat("AlertFileUploadService.Queue >> File uploaded to server with ID >> ", processRequest.AlertId, " - success ", response.Success), LogType.Default);
stopwatch.Stop();
Logger.Logger.Instance.WriteEventLog(string.Concat("AlertFileUploadService.Queue >> Time Consumed in ProcessToS3Server >> ", stopwatch.Elapsed.TotalMilliseconds, " - success ", response.Success), LogType.Default);
stopwatch.Reset();
stopwatch = Stopwatch.StartNew();
//Update in Database
Task<long> updateId = M.MessageProcessor.UpdateProcessedData(processToQueue, response);
Logger.Logger.Instance.WriteEventLog(string.Concat("AlertFileUploadService.Queue >> Alert ID >> ", processRequest.AlertId, "\nKey >> ", processRequest.Key, "\nLink >>", response.PreSignedURL), LogType.Default);
stopwatch.Stop();
Logger.Logger.Instance.WriteEventLog(string.Concat("AlertFileUploadService.Queue >> Time Consumed in UpdateProcessedData >> ", stopwatch.Elapsed.TotalMilliseconds, " - success ", response.Success), LogType.Default);
}
}
}
catch (Exception ex)
{
Logger.Logger.Instance.WriteExceptionLog(string.Concat("AlertFileUploadService.Queue >> ", ex.Message), LogType.Default, ex);
throw ex;
}
}
Примечание : выбросить новое исключение («Примечание: это для проверки, остается ли сообщение в очереди»);Кроме того, я пробовал выше ProcessToQueue сообщение с транзакцией со стороны клиента, но без усиления.
, и это моя конфигурация.
<system.serviceModel>
<services>
<!--Alert FileUploader(Queue) Service Start-->
<service name="AlertFileUploadService.Queue.QueueService">
<endpoint address="net.msmq://localhost/private/FileUpload"
binding="netMsmqBinding"
contract="AlertFileUploadService.IQueueService">
</endpoint>
<host>
<baseAddresses>
<add baseAddress="http://localhost:5813/FileUploadToMSMQ"/>
</baseAddresses>
</host>
</service>
<!--Alert FileUploader(Queue) Service End-->
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<netMsmqBinding>
<binding>
<security mode="None"></security>
</binding>
</netMsmqBinding>
</bindings>
Вот так я получаю звонок из клиентского приложения.
queueProxyService = new QueueServiceClient();
string queueName = string.Concat(".\\Private$\\", AppConfigs.QueueInstanceName);
queueProxyService = new QueueServiceClient();
queueProxyService.ProcessToQueue(new QueueService.ProcessRequest()
{
AlertId = result.AlertId,
ImageBytes = req.ImageBytes,
Key = RequestId,
Link = ""
}, queueName);