public virtual void BeginPublish(IEndpointIncomingRequest request)
{
PublishRequest input = (PublishRequest)request.Request;
OperationContext context = ValidateRequest(input.RequestHeader, RequestType.Publish);
try
{
AsyncPublishOperation operation = new AsyncPublishOperation(context, request, this);
uint subscriptionId = 0;
UInt32Collection availableSequenceNumbers = null;
bool moreNotifications = false;
NotificationMessage notificationMessage = null;
StatusCodeCollection results = null;
DiagnosticInfoCollection diagnosticInfos = null;
notificationMessage = ServerInternal.SubscriptionManager.Publish(
context,
input.SubscriptionAcknowledgements,
operation,
out subscriptionId,
out availableSequenceNumbers,
out moreNotifications,
out results,
out diagnosticInfos);
// request completed asychrnously.
if (notificationMessage != null)
{
OnRequestComplete(context);
operation.Response.ResponseHeader = CreateResponse(input.RequestHeader, context.StringTable);
operation.Response.SubscriptionId = subscriptionId;
operation.Response.AvailableSequenceNumbers = availableSequenceNumbers;
operation.Response.MoreNotifications = moreNotifications;
operation.Response.Results = results;
operation.Response.DiagnosticInfos = diagnosticInfos;
operation.Response.NotificationMessage = notificationMessage;
// Utils.Trace("PUBLISH: #{0} Completed Synchronously", input.RequestHeader.RequestHandle);
request.OperationCompleted(operation.Response, null);
}
}
catch (ServiceResultException e)
{
OnRequestComplete(context);
lock (ServerInternal.DiagnosticsLock)
{
ServerInternal.ServerDiagnostics.RejectedRequestsCount++;
if (IsSecurityError(e.StatusCode))
{
ServerInternal.ServerDiagnostics.SecurityRejectedRequestsCount++;
}
}
throw TranslateException(context, e);
}
}