Пример #1
0
 public override void ProcessRequest(IServiceRequest request, IServiceResponse response, IResourceRepository resourceRepository)
 {
     EAEPMessages messages = new EAEPMessages(request.Body);
     monitorStore.PushMessages(messages);
     response.StatusCode = Constants.HTTP_200_OK;
     response.StatusDescription = "OK";
 }
Пример #2
0
        /// <summary>
        /// 得到操作元数据
        /// </summary>
        /// <param name="req"></param>
        /// <returns></returns>
        public virtual IOperationDescriptor GetOperationDescriptor(IServiceRequest req)
        {
            Guard.NotNull(req, "req");
            var serviceDescriptor = DescriptorManager.GetServiceDescriptor(req.ServiceName);
            if (serviceDescriptor == null)
                throw new ServiceDispatcherException(
                        ServiceDispatcherExceptionCode.ServiceNotFound)
                {
                    ServiceName = req.ServiceName
                    ,
                    OperationName = req.OperationName
                };

            //得到领域Action元数据
            var operationDesc = serviceDescriptor[req.OperationName];
            if (operationDesc == null)
                throw new ServiceDispatcherException(
                        ServiceDispatcherExceptionCode.OperationNotFound)
                {
                    ServiceName = req.ServiceName
                    ,
                    OperationName = req.OperationName
                };

            return operationDesc;
        }
Пример #3
0
        /// <summary>
        /// Injects the given factory into the target container.
        /// </summary>
        /// <param name="request">The <see cref="IServiceRequest"/> instance that describes the service that is currently being requested.</param>
        public void Preprocess(IServiceRequest request)
        {
            // Inject the custom factory if no other
            // replacement exists
            if (request.ActualFactory != null)
                return;

            var serviceType = request.ServiceType;

            // Skip any service requests for types that are generic type definitions
            if (serviceType.IsGenericTypeDefinition)
                return;

            // If the current service type is a generic type,
            // its type definition must match the given service type
            if (serviceType.IsGenericType && serviceType.GetGenericTypeDefinition() != _serviceType)
                return;

            // The service types must match
            if (!serviceType.IsGenericType && serviceType != _serviceType)
                return;

            // Inject the custom factory itself
            request.ActualFactory = _factory;
        }
Пример #4
0
        public override void ProcessRequest(IServiceRequest request, IServiceResponse response, IResourceRepository resourceRepository)
        {
            response.ContentType = Constants.CONTENT_TYPE_JSON;

            EAEPMessages messages = null;

            if (request.GetParameter(Constants.QUERY_STRING_FROM) != null)
            {
                DateTime from = DateTime.ParseExact(request.GetParameter(Constants.QUERY_STRING_FROM), Constants.FORMAT_DATETIME, CultureInfo.InvariantCulture);
                if (request.GetParameter(Constants.QUERY_STRING_TO) != null)
                {
                    messages = monitor.GetMessages(
                        from,
                        DateTime.ParseExact(request.GetParameter(Constants.QUERY_STRING_TO), Constants.FORMAT_DATETIME, CultureInfo.InvariantCulture),
                        request.Query
                        );
                }
                else
                {
                    messages = monitor.GetMessages(from, request.Query);
                }
            }
            else
            {
                messages = monitor.GetMessages(request.Query);
            }
            using (StreamWriter writer = new StreamWriter(response.ContentStream))
            {
                string json = JsonConvert.SerializeObject(messages);
                writer.Write(json);
            }
        }
Пример #5
0
        /// <summary>
        /// Instantiates the service described by the <paramref name="serviceRequest"/>.
        /// </summary>
        /// <param name="serviceRequest">The <see cref="IServiceRequest"/> that describes the service that needs to be instantiated.</param>
        /// <returns>A valid object reference if the service can be found; otherwise, it will return <c>null</c>.</returns>
        public virtual object GetService(IServiceRequest serviceRequest)
        {
            // Allow users to intercept the instantiation process
            if (_preProcessor != null)
                _preProcessor.Preprocess(serviceRequest);

            var factoryRequest = new FactoryRequest
            {
                ServiceType = serviceRequest.ServiceType,
                ServiceName = serviceRequest.ServiceName,
                Arguments = serviceRequest.ActualArguments,
                Container = _container
            };

            var instance = _creator.CreateFrom(factoryRequest, serviceRequest.ActualFactory);

            // Postprocess the results
            var result = new ServiceRequestResult
            {
                ServiceName = serviceRequest.ServiceName,
                ActualResult = instance,
                Container = _container,
                OriginalResult = instance,
                ServiceType = serviceRequest.ServiceType,
                AdditionalArguments = serviceRequest.ActualArguments
            };

            if (_postProcessor != null)
                _postProcessor.PostProcess(result);

            return result.ActualResult ?? result.OriginalResult;
        }
Пример #6
0
 /// <summary>
 /// A method that passes every request result made
 /// to the list of preprocessors.
 /// </summary>
 /// <param name="request">The parameter that describes the context of the service request.</param>
 public void Preprocess(IServiceRequest request)
 {
     foreach (var preprocessor in _preProcessors)
     {
         preprocessor.Preprocess(request);
     }
 }
Пример #7
0
        public Task<IServiceResponse<int>> InsertMyObject(IServiceRequest<MyObject> obj)
        {
            obj.MustNotBeNull("obj");

            return Task.Factory.StartNew(() =>
            {
                using (var repo = new ExampleRepo())
                {
                    var toInsert = Mapper.Map<MyEntity>(obj.Argument);
                    try
                    {
                        repo.MyEntities.Insert(toInsert);
                    }
                    catch (Exception ex)
                    {
                        //yes - catching all exceptions is not good - but this is just demonstrating how you might use the exception to
                        //generate a failed response that automatically has the exception on it.

                        //IN SOME CASES, your service layer operations will bubble their exceptions out, of course - it all depends
                        //on how you want to handle it.
                        return ex.AsFailedResponse<int>();
                    }

                    return toInsert.Id.AsSuccessfulResponse();
                }
            });
        }
Пример #8
0
            public override bool IsValidName(IServiceRequest req, string actionName, IOperationDescriptor operationDesc)
            {
                if (string.IsNullOrEmpty(this.Name))
                    return false;

                return req.Arguments.ContainsKey(this.Name);
            }
 public System.Threading.Tasks.Task<IServiceResponse<PagedResult<MyObject>>> QueryMyObjects(IServiceRequest<PagedQuery> query)
 {
     //no caching here
     //although - what we could do is check whether any of the objects coming back are in the cache and, if they are,
     //then we replace them for when we do individual gets ONLY
     return _inner.QueryMyObjects(query);
 }
Пример #10
0
 public async System.Threading.Tasks.Task<IServiceResponse<MyObject>> GetMyObject(IServiceRequest<int> id)
 {
     // so we use the same validation mechanism that's used over in the Direct service implementation in
     // ../WebAPIDemos.ServiceLayer.Direct/MyObjectService.cs
     id.MustNotBeNull("id");
     //note - I'm using await here to handle the implicit casting of ApiServiceResponse<T> to IServiceResponse<T>
     return await _requestManager.Get<ApiServiceResponse<MyObject>>(string.Format("api/MyObjects/{0}", id.Argument.ToString()), id);
 }
Пример #11
0
 protected void WriteContent(IServiceRequest request, IServiceResponse response, IResourceRepository resourceRepository)
 {
     response.ContentType = "text/html";
        using (StreamWriter targetWriter = new StreamWriter(response.ContentStream))
     {
         InternalWriteContent(targetWriter, request, response, resourceRepository);
     }
 }
Пример #12
0
 private static void WriteSearchResultHeader(StreamWriter writer, IServiceRequest request, IResourceRepository resourceRepository, string searchResultText)
 {
     string header = resourceRepository.GetResourceAsString("searchresultheader.htm");
     Hashtable values = new Hashtable();
     values.Add("queryparam", Constants.QUERY_STRING_QUERY);
     values.Add("query", request.Query);
     values.Add("searchresulttext", searchResultText);
     writer.WriteLine(TemplateParser.Parse(header, values));
 }
Пример #13
0
 public ServiceProxy(string cloudId, string accessKey, string secretKey, string apiHost)
 {
     _cloudId = cloudId;
     _apiHost = apiHost;
     _secretKey = secretKey;
     _accessKey = accessKey;
     _utility = new ServiceProxyUtility();
     _serviceRequest = new ServiceRequest();
 }
Пример #14
0
        public AuthorizationInfo GetAuthorizationInfo(IServiceRequest requestContext)
        {
            object cached;
            if (requestContext.Items.TryGetValue("AuthorizationInfo", out cached))
            {
                return (AuthorizationInfo)cached;
            }

            return GetAuthorization(requestContext);
        }
Пример #15
0
        private void ValidateUser(IServiceRequest request,
            IAuthenticationAttributes authAttribtues)
        {
            // This code is executed before the service
            var auth = AuthorizationContext.GetAuthorizationInfo(request);

            if (!IsExemptFromAuthenticationToken(auth, authAttribtues))
            {
                var valid = IsValidConnectKey(auth.Token);

                if (!valid)
                {
                    ValidateSecurityToken(request, auth.Token);
                }
            }

            var user = string.IsNullOrWhiteSpace(auth.UserId)
                ? null
                : UserManager.GetUserById(auth.UserId);

            if (user == null & !string.IsNullOrWhiteSpace(auth.UserId))
            {
                throw new SecurityException("User with Id " + auth.UserId + " not found");
            }

            if (user != null)
            {
                ValidateUserAccess(user, request, authAttribtues, auth);
            }

            var info = GetTokenInfo(request);

            if (!IsExemptFromRoles(auth, authAttribtues, info))
            {
                var roles = authAttribtues.GetRoles().ToList();

                ValidateRoles(roles, user);
            }

            if (!string.IsNullOrWhiteSpace(auth.DeviceId) &&
                !string.IsNullOrWhiteSpace(auth.Client) &&
                !string.IsNullOrWhiteSpace(auth.Device))
            {
                SessionManager.LogSessionActivity(auth.Client,
                    auth.Version,
                    auth.DeviceId,
                    auth.Device,
                    request.RemoteIp,
                    user);
            }
        }
Пример #16
0
 public void Handle(IServiceRequest request, IServiceResponse response, IResourceRepository resourceRepository)
 {
     try
     {
         ProcessRequest(request, response, resourceRepository);
         response.StatusCode = Constants.HTTP_200_OK;
         response.StatusDescription = "OK";
     }
     catch (Exception)
     {
         response.StatusCode = Constants.HTTP_500_SERVER_ERROR;
         response.StatusDescription = "Error, review logs";
     }
 }
Пример #17
0
        public Task<SessionInfo> GetSession(IServiceRequest requestContext)
        {
            var authorization = _authContext.GetAuthorizationInfo(requestContext);

            //if (!string.IsNullOrWhiteSpace(authorization.Token))
            //{
            //    var auth = GetTokenInfo(requestContext);
            //    if (auth != null)
            //    {
            //        return _sessionManager.GetSessionByAuthenticationToken(auth, authorization.DeviceId, requestContext.RemoteIp, authorization.Version);
            //    }
            //}

            var user = string.IsNullOrWhiteSpace(authorization.UserId) ? null : _userManager.GetUserById(authorization.UserId);
            return _sessionManager.LogSessionActivity(authorization.Client, authorization.Version, authorization.DeviceId, authorization.Device, requestContext.RemoteIp, user);
        }
        public IServiceResponse Get(IServiceRequest request, IRequestSettings restSettings)
        {
            if (Auth != null)
                client.Authenticator = Auth;

            var restRequest = new RestRequest(request.Uri, Method.GET);
            var response = client.Execute(restRequest);

            return new ServiceResponse
            {
                Data = response.Content,
                StatusCode = response.StatusCode,
                ErrorException = response.ErrorException,
                ErrorMessage = response.ErrorMessage
            };
        }
Пример #19
0
        public override void ProcessRequest(IServiceRequest request, IServiceResponse response, IResourceRepository resourceRepository)
        {
            string[] values = store.Distinct(
                request.GetParameter(Constants.QUERY_STRING_FIELD),
                DateTime.ParseExact(request.GetParameter(Constants.QUERY_STRING_FROM), Constants.FORMAT_DATETIME, CultureInfo.InvariantCulture),
                DateTime.ParseExact(request.GetParameter(Constants.QUERY_STRING_TO), Constants.FORMAT_DATETIME, CultureInfo.InvariantCulture),
                request.Query
                );

            response.ContentType = Constants.CONTENT_TYPE_JSON;

            using (StreamWriter writer = new StreamWriter(response.ContentStream))
            {
                string json = JsonConvert.SerializeObject(values);
                writer.Write(json);
            }
        }
Пример #20
0
        public override void ProcessRequest(IServiceRequest request, IServiceResponse response, IResourceRepository resourceRepository)
        {
            CountResult[] result = store.Count(
                DateTime.ParseExact(request.GetParameter(Constants.QUERY_STRING_FROM), Constants.FORMAT_DATETIME, CultureInfo.InvariantCulture),
                DateTime.ParseExact(request.GetParameter(Constants.QUERY_STRING_TO), Constants.FORMAT_DATETIME, CultureInfo.InvariantCulture),
                int.Parse(request.GetParameter(Constants.QUERY_STRING_TIMESLICES)),
                request.GetParameter(Constants.QUERY_STRING_GROUPBY),
                request.Query
                );

            response.ContentType = Constants.CONTENT_TYPE_JSON;

            using (StreamWriter writer = new StreamWriter(response.ContentStream))
            {
                writer.Write((string) JsonConvert.SerializeObject(result));
            }
        }
        //note - for testability - a better implementation of this service would accept an IServiceCache abstraction
        //(name is actually irrelevant - it'd be a proprietary type for this solution),
        //and then one implementation of that would operate over the HostingEnvironment.Cache; making it
        //possible to isolate this class in a unit test with a mocked IServiceCache implementation.

        public async System.Threading.Tasks.Task<IServiceResponse<MyObject>> GetMyObject(IServiceRequest<int> id)
        {
            id.MustNotBeNull("id");
            string cacheKey = MyObjectCacheKey(id.Argument);
            //do caching 
            MyObject cached = (MyObject)HostingEnvironment.Cache[cacheKey];
            if (cached != null)
                return cached.AsSuccessfulResponse();

            //try and retrieve the object from the inner service.  The logic here is if we get a successful response, then 
            //we will cache it.  Otherwise we will simply return the response.  So, crucially, failed lookups are never cached in
            //this implementation - which, in practise, might not be desirable.
            var response = await _inner.GetMyObject(id);

            if (response.Success)
                HostingEnvironment.Cache.Insert(cacheKey, response.Result, null, DateTime.UtcNow.AddMinutes(5), System.Web.Caching.Cache.NoSlidingExpiration);

            return response;
        }
Пример #22
0
        /// <summary>
        /// Begins an asynchronous operation to send a request over the secure channel.
        /// </summary>
        /// <param name="request">The request to send.</param>
        /// <param name="callback">The callback to call when the operation completes.</param>
        /// <param name="callbackData">The callback data to return with the callback.</param>
        /// <returns>
        /// The result which must be passed to the EndSendRequest method.
        /// </returns>
        /// <exception cref="ServiceResultException">Thrown if any communication error occurs.</exception>
        /// <seealso cref="SendRequest"/>
        public IAsyncResult BeginSendRequest(IServiceRequest request, AsyncCallback callback, object callbackData)
        {
            TcpClientChannel channel = m_channel;

            if (channel == null)
            {
                lock (m_lock)
                {
                    if (m_channel == null)
                    {
                        OpenOnDemand();
                    }

                    channel = m_channel;
                }
            }

            return(channel.BeginSendRequest(request, m_operationTimeout, callback, callbackData));
        }
Пример #23
0
        /// <summary>
        /// Dispatches an incoming binary encoded request.
        /// </summary>
        /// <param name="request">Request.</param>
        /// <returns>Invoke service response message.</returns>
        public virtual InvokeServiceResponseMessage InvokeService(InvokeServiceMessage request)
        {
            IServiceRequest  decodedRequest = null;
            IServiceResponse response       = null;

            // create context for request and reply.
            ServiceMessageContext context = MessageContext;

            try
            {
                // check for null.
                if (request == null || request.InvokeServiceRequest == null)
                {
                    throw new ServiceResultException(StatusCodes.BadDecodingError, Utils.Format("Null message cannot be processed."));
                }

                // decoding incoming message.
                decodedRequest = BinaryDecoder.DecodeMessage(request.InvokeServiceRequest, null, context) as IServiceRequest;

                // invoke service.
                response = ProcessRequest(decodedRequest);

                // encode response.
                InvokeServiceResponseMessage outgoing = new InvokeServiceResponseMessage();
                outgoing.InvokeServiceResponse = BinaryEncoder.EncodeMessage(response, context);
                return(outgoing);
            }
            catch (Exception e)
            {
                // create fault.
                ServiceFault fault = CreateFault(decodedRequest, e);

                // encode fault response.
                if (context == null)
                {
                    context = new ServiceMessageContext();
                }

                InvokeServiceResponseMessage outgoing = new InvokeServiceResponseMessage();
                outgoing.InvokeServiceResponse = BinaryEncoder.EncodeMessage(fault, context);
                return(outgoing);
            }
        }
 /// <summary>
 /// Handles requests arriving from a channel.
 /// </summary>
 private void OnRequestReceived(TcpListenerChannel channel, uint requestId, IServiceRequest request)
 {
     try
     {
         if (m_callback != null)
         {
             IAsyncResult result = m_callback.BeginProcessRequest(
                 channel.GlobalChannelId,
                 channel.EndpointDescription,
                 request,
                 OnProcessRequestComplete,
                 new object[] { channel, requestId, request });
         }
     }
     catch (Exception e)
     {
         Utils.LogError(e, "TCPLISTENER - Unexpected error processing request.");
     }
 }
        /// <summary>
        /// Begins an asynchronous operation to send a request over the secure channel.
        /// </summary>
        /// <param name="request">The request to send.</param>
        /// <param name="callback">The callback to call when the operation completes.</param>
        /// <param name="callbackData">The callback data to return with the callback.</param>
        /// <returns>
        /// The result which must be passed to the EndSendRequest method.
        /// </returns>
        /// <exception cref="ServiceResultException">Thrown if any communication error occurs.</exception>
        /// <seealso cref="SendRequest"/>
        public IAsyncResult BeginSendRequest(IServiceRequest request, AsyncCallback callback, object callbackData)
        {
            UaSCUaBinaryClientChannel channel = m_channel;

            if (channel == null)
            {
                lock (m_lock)
                {
                    if (m_channel == null)
                    {
                        CreateChannel();
                    }

                    channel = m_channel;
                }
            }

            return(channel.BeginSendRequest(request, m_operationTimeout, callback, callbackData));
        }
Пример #26
0
        /// <summary>
        /// 监听异常
        /// </summary>
        /// <param name="req"></param>
        /// <param name="resp"></param>
        /// <param name="operationDesc"></param>
        public override void OnExceptionFired(IServiceRequest req, IServiceResponse resp, IOperationDescriptor operationDesc)
        {
            IRedirectToErrorResult errorNav = null;
            if (operationDesc != null)
            {
                if (operationDesc.Extensions.ContainsKey(ControllerListener.ErrorNavigation))
                    errorNav = operationDesc.Extensions[ControllerListener.ErrorNavigation] as IRedirectToErrorResult;
                else if (operationDesc.ServiceDescriptor.Extensions.ContainsKey(ControllerListener.ErrorNavigation))
                    errorNav = operationDesc.ServiceDescriptor.Extensions[ControllerListener.ErrorNavigation] as IRedirectToErrorResult;
            }
            //执行失败后, 设置mvc的 controller serviceDispatcherName 和 ActionName
            if (errorNav != null)
            {
                req.Context[ControllerListener.NavigationResult] = errorNav;

                if (errorNav.IsSaveModelState)
                    resp.Result = req.Arguments.FirstOrDefault();//TODO:
            }
        }
Пример #27
0
        /// <inheritdoc/>
        public async Task <IServiceResponse> SendRequestAsync(IServiceRequest request, CancellationToken ct)
        {
            try
            {
                ByteArrayContent content = new ByteArrayContent(BinaryEncoder.EncodeMessage(request, m_quotas.MessageContext));
                content.Headers.ContentType = m_mediaTypeHeaderValue;
                var result = await m_client.PostAsync(m_url, content, ct).ConfigureAwait(false);

                result.EnsureSuccessStatusCode();
                Stream responseContent = await result.Content.ReadAsStreamAsync().ConfigureAwait(false);

                return(BinaryDecoder.DecodeMessage(responseContent, null, m_quotas.MessageContext) as IServiceResponse);
            }
            catch (Exception ex)
            {
                Utils.Trace("Exception sending HTTPS request: " + ex.Message);
                throw;
            }
        }
        public IServiceResponse Get(IServiceRequest request)
        {
            if (Auth != null)
            {
                client.Authenticator = Auth;
            }

            var restRequest = new RestRequest(request.Uri, Method.GET);

            var response = client.Execute(restRequest);

            return(new ServiceResponse
            {
                Data = response.Content,
                StatusCode = response.StatusCode,
                ErrorException = response.ErrorException,
                ErrorMessage = response.ErrorMessage
            });
        }
Пример #29
0
        public bool Check()
        {
            bool didAnything = false;

            foreach (IHttpRequestModule iHttpReq in m_modules)
            {
                IServiceRequest httpInfo = null;

                if (iHttpReq != null)
                {
                    httpInfo = iHttpReq.GetNextCompletedRequest();
                }

                if (httpInfo == null)
                {
                    continue;
                }

                while (httpInfo != null)
                {
                    HttpRequestClass info = (HttpRequestClass)httpInfo;
                    //m_log.Debug("[AsyncLSL]:" + httpInfo.response_body + httpInfo.status);

                    // Deliver data to prim's remote_data handler

                    iHttpReq.RemoveCompletedRequest(info);

                    object[] resobj = new object[]
                    {
                        new LSL_Types.LSLString(info.ReqID.ToString()),
                        new LSL_Types.LSLInteger(info.Status),
                        new LSL_Types.list(info.Metadata),
                        new LSL_Types.LSLString(info.ResponseBody)
                    };

                    m_ScriptEngine.AddToObjectQueue(info.PrimID, "http_response", new DetectParams[0], -1, resobj);
                    httpInfo = iHttpReq.GetNextCompletedRequest();
                }
                didAnything = true;
            }
            return(didAnything);
        }
Пример #30
0
        /// <summary>
        /// Called when a request completes.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <param name="response">The response.</param>
        /// <param name="serviceName">The name of the service.</param>
        protected virtual void RequestCompleted(IServiceRequest request, IServiceResponse response, string serviceName)
        {
            uint       requestHandle = 0;
            StatusCode statusCode    = StatusCodes.Good;

            if (request != null)
            {
                requestHandle = request.RequestHeader.RequestHandle;
            }
            else if (response != null)
            {
                requestHandle = response.ResponseHeader.RequestHandle;
                statusCode    = response.ResponseHeader.ServiceResult;
            }

            if (response == null)
            {
                statusCode = StatusCodes.Bad;
            }

            int pendingRequestCount = Interlocked.Decrement(ref m_pendingRequestCount);

            if (statusCode != StatusCodes.Good)
            {
                Utils.Trace(
                    (int)Utils.TraceMasks.Service,
                    "{0} Completed. RequestHandle={1}, PendingRequestCount={3}, StatusCode={2}",
                    serviceName,
                    requestHandle,
                    statusCode,
                    pendingRequestCount);
            }
            else
            {
                Utils.Trace(
                    (int)Utils.TraceMasks.Service,
                    "{0} Completed. RequestHandle={1}, PendingRequestCount={2}",
                    serviceName,
                    requestHandle,
                    pendingRequestCount);
            }
        }
Пример #31
0
        /// <summary>
        /// Begins an asynchronous operation to send a request over the secure channel.
        /// </summary>
        public IAsyncResult BeginSendRequest(IServiceRequest request, AsyncCallback callback, object callbackData)
        {
#if !SILVERLIGHT
            if (!m_servicePointInitialized)
            {
                ServicePoint sp = System.Net.ServicePointManager.FindServicePoint(m_url);
                sp.ConnectionLimit        = 1000;
                m_servicePointInitialized = true;
            }
#endif

            HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(m_url.ToString());
            webRequest.Method = "POST";

            if (m_settings.Configuration.UseBinaryEncoding)
            {
                webRequest.ContentType = "application/octet-stream";
            }
            else
            {
                StringBuilder contentType = new StringBuilder();
                contentType.Append("application/soap+xml; charset=\"utf-8\"; action=\"");
                contentType.Append(Namespaces.OpcUaWsdl);
                contentType.Append("/");

                string typeName = request.GetType().Name;
                int    index    = typeName.LastIndexOf("Request");
                contentType.Append(typeName.Substring(0, index));
                ;
                contentType.Append("\"");

                webRequest.ContentType = contentType.ToString();

#if !SILVERLIGHT
                webRequest.Headers.Add("OPCUA-SecurityPolicy", this.m_settings.Description.SecurityPolicyUri);
#endif
            }

            AsyncResult result = new AsyncResult(callback, callbackData, m_operationTimeout, request, webRequest);
            webRequest.BeginGetRequestStream(OnGetRequestStreamComplete, result);
            return(result);
        }
Пример #32
0
 /// <summary>
 /// 分发服务调用
 /// </summary>
 /// <param name="req">请求</param>
 /// <returns>返回响应信息</returns>
 public IServiceResponse Dispatch(IServiceRequest req)
 {
     Guard.NotNull(req, "req");
     try
     {
         ListenManager.OnDispatching(req);
         return(OnExecute(req));
     }
     finally
     {
         try
         {
             ListenManager.OnDispatched(req);
         }
         catch (Exception ex)
         {
             ExceptionManager.Handle(ex);
         }
     }
 }
Пример #33
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="req"></param>
        /// <param name="resp"></param>
        /// <param name="operationDesc"></param>
        public override void OnExceptionFired(IServiceRequest req, IServiceResponse resp, IOperationDescriptor operationDesc)
        {
            var current     = MonitorContext.Current;
            var monitorData = current.Data;

            if (current.OperationStopwatch.IsRunning)
            {
                current.OperationStopwatch.Stop();
            }
            else
            {
                foreach (var key in req.Arguments.Keys)
                {
                    monitorData.Args[key] = req.Arguments[key];
                }
            }
            current.Data.HasError     = true;
            current.Data.ErrorMessage = resp.Exception.Message;
            current.Data.StackTrace   = resp.Exception.StackTrace;
        }
Пример #34
0
        /// <summary>
        /// Creates a fault message.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <param name="exception">The exception.</param>
        /// <returns>A fault message.</returns>
        protected static Exception CreateSoapFault(IServiceRequest request, Exception exception)
        {
            ServiceFault fault = CreateFault(request, exception);

            // get the error from the header.
            ServiceResult error = fault.ResponseHeader.ServiceResult;

            if (error == null)
            {
                error = ServiceResult.Create(StatusCodes.BadUnexpectedError, "An unknown error occurred.");
            }

            // construct the fault code and fault reason.
            string codeName = StatusCodes.GetBrowseName(error.Code);

            FaultCode   code   = null;
            FaultReason reason = null;

            if (!LocalizedText.IsNullOrEmpty(error.LocalizedText))
            {
                reason = new FaultReason(new FaultReasonText(Utils.Format("{0}", error.LocalizedText),
                                                             CultureInfo.InvariantCulture));
            }
            else
            {
                reason = new FaultReason(new FaultReasonText(codeName, CultureInfo.InvariantCulture));
            }

            if (!String.IsNullOrEmpty(error.SymbolicId))
            {
                FaultCode subcode = new FaultCode(error.SymbolicId, error.NamespaceUri);
                code = new FaultCode(codeName, Namespaces.OpcUa, subcode);
            }
            else
            {
                code = new FaultCode(codeName, Namespaces.OpcUa);
            }

            // throw the fault.
            return(new FaultException <ServiceFault>(fault, reason, code));
        }
Пример #35
0
        public Task<IServiceResponse<MyObject>> GetMyObject(IServiceRequest<int> id)
        {
            id.MustNotBeNull("id");

            MyObject foo = null;

            //return Task.FromResult(foo.AsSuccessfulResponse());

            return Task.Factory.StartNew(() =>
            {
                using (var repo = new ExampleRepo())
                {
                    var found = Mapper.Map<MyObject>(repo.MyEntities.Fetch(id.Argument));

                    if (found != null)
                        return found.AsSuccessfulResponse();
                    else //could be nicer - ideally want a 'AsResponse' method that will auto-select success/fail based on not-null/null
                        return found.AsFailedResponse();
                }
            });
        }
Пример #36
0
        bool ValidateParamters(IOperationDescriptor operationDesc, IServiceRequest req, ServiceResponse resp)
        {
            if (!req.ValidateRequest ||
                req.Arguments == null ||
                req.Arguments.Count == 0)
            {
                return(true);
            }

            foreach (var key in req.Arguments.Keys)
            {
                var errorState = Validator.Validate(req.Arguments[key]);
                if (errorState.Count > 0)
                {
                    resp.ErrorState.AddRange(errorState);
                    return(false);
                }
            }

            return(true);
        }
Пример #37
0
        /// <summary>
        /// Dispatches an incoming binary encoded request.
        /// </summary>
        /// <param name="incoming">Incoming request.</param>
        public virtual IServiceResponse ProcessRequest(IServiceRequest incoming)
        {
            try {
                SetRequestContext(RequestEncoding.Binary);

                ServiceDefinition service = null;

                // find service.
                if (!SupportedServices.TryGetValue(incoming.TypeId, out service))
                {
                    throw new ServiceResultException(StatusCodes.BadServiceUnsupported,
                                                     Utils.Format("'{0}' is an unrecognized service identifier.", incoming.TypeId));
                }

                // invoke service.
                return(service.Invoke(incoming));
            } catch (Exception e) {
                // create fault.
                return(CreateFault(incoming, e));
            }
        }
Пример #38
0
        protected override void InternalWriteContent(StreamWriter writer, IServiceRequest request, IServiceResponse response, IResourceRepository resourceRepository)
        {
            resourceRepository.WriteResource("header.htm", writer);

            bool activeSearch = (request.Query != null);

            try
            {

                EAEPMessages messages = new EAEPMessages();
                string searchResultText = string.Empty;

                if (activeSearch)
                {
                    messages = monitor.GetMessages(request.Query);

                    searchResultText = string.Format("{0} message(s) found", messages.Count);
                }

                WriteSearchResultHeader(writer, request, resourceRepository, searchResultText);

                int maxItems = 100;
                if (maxItems > messages.Count) { maxItems = messages.Count; }

                string messageTemplate = resourceRepository.GetResourceAsString("eaepmsg.htm");

                for (int i = 0; i < maxItems; i++)
                {
                    WriteResultItem(writer, messageTemplate, messages[i]);
                }
            }
            catch (Exception ex)
            {
                writer.WriteLine(ReplaceCRLFwithHTMLLineBreaks(ex.ToString()));
            }

            resourceRepository.WriteResource("searchresultfooter.htm", writer);

            resourceRepository.WriteResource("footer.htm", writer);
        }
Пример #39
0
        /// <summary>
        /// Do really cool powershell things
        /// </summary>
        /// <param name="script"></param>
        /// <param name="request"></param>
        private void ExecuteScriptForRequest(Script script, IServiceRequest request)
        {
            Runspace runspace = RunspaceFactory.CreateRunspace();

            runspace.Open();

            // create a pipeline and feed it the script
            Pipeline pipeline = runspace.CreatePipeline();

            try
            {
                pipeline.Commands.AddScript(@"C:\Scripts\" + script.FileName);
            }
            catch (Exception exception)
            {
                Displaymessage($"Error: {exception.Message}", MessageType.Failure);
            }
            // add parameters
            runspace.SessionStateProxy.SetVariable("RequestedFor", request.RequestedForGuids);
            runspace.SessionStateProxy.SetVariable("Requestor", request.RequestedByGuid);
            foreach (var userInput in request.ServiceRequestUserInputs)             //just add everything
            {
                runspace.SessionStateProxy.SetVariable(userInput.Name, userInput.Value);
            }
            try
            {
                Collection <PSObject> results = pipeline.Invoke();
                Displaymessage("Script results: ", MessageType.Info);

                foreach (var psObject in results)
                {
                    Displaymessage(psObject.ToString(), MessageType.ScriptResult);
                }
            }
            catch (Exception exception)
            {
                Displaymessage($"Error in executing script: {exception.Message}", MessageType.Failure);
            }
            Console.WriteLine($"Completed execution of {request.Name}");
        }
Пример #40
0
        /// <summary>
        /// Handles requests arriving from a channel.
        /// </summary>
        private void OnRequestReceived(TcpServerChannel channel, uint requestId, IServiceRequest request)
        {
            // HONEYPOT - obtain the remote IP address and port if possible
            TcpMessageSocket tcpSocket = channel.Socket as TcpMessageSocket;
            IPAddress        remoteIP  = null;
            int remotePort             = 0;

            if (tcpSocket != null)
            {
                EndPoint remoteEndpoint = tcpSocket.getRemoteEndpoint();
                if (remoteEndpoint != null)
                {
                    IPEndPoint ipEndpoint = remoteEndpoint as IPEndPoint;
                    if (ipEndpoint != null)
                    {
                        remoteIP   = ipEndpoint.Address;
                        remotePort = ipEndpoint.Port;
                    }
                }
            }

            try
            {
                if (m_callback != null)
                {
                    IAsyncResult result = m_callback.BeginProcessRequest(
                        channel.GlobalChannelId,
                        channel.EndpointDescription,
                        request,
                        OnProcessRequestComplete,
                        new object[] { channel, requestId, request },
                        remoteIP,       // HONEYPOT
                        remotePort);    // HONEYPOT
                }
            }
            catch (Exception e)
            {
                Utils.Trace(e, "TCPLISTENER - Unexpected error processing request.");
            }
        }
Пример #41
0
        public IServiceResponse Execute(IServiceRequest request)
        {
            IServiceResponse response;
            var requestObject = request as TRequest;

            try
            {
                ValidateRequest(requestObject);
                DoServiceExecute(requestObject);
                response = GenerateResponse(requestObject);
            }
            catch (Exception e)
            {
                _log.ErrorFormat("Service exception on request (id: {0}) for service: {1}", request.RequestId, request.ServiceName);
                _log.DebugFormat("Exception data: {0}{1}", Environment.NewLine, e.Message);

                // TODO: I could call a factory to generate an error response
                response = BuildErrorResponse(request);
            }

            return(response);
        }
Пример #42
0
        public async System.Threading.Tasks.Task<IServiceResponse<PagedResult<MyObject>>> QueryMyObjects(IServiceRequest<PagedQuery> query)
        {
            query.MustNotBeNull("query");
            
            //this method of query strings from object content can be refactored.  However, it will have to be a more complex solution
            //that is completely generic and handles nested objects in the same way that the server libraries expect to see.
            //for now, this merely demonstrates the core principle.
            Dictionary<string, string> queryKeyValues = new Dictionary<string, string>();
            //some system that relies on a similar mechanism to Model Binding should be used to convert to strings.  That uses
            //the TypeDescriptor.GetConverter mechanism, so we couuld do the same.
            queryKeyValues["Page"] = Convert.ToString(query.Argument.Page);
            queryKeyValues["PageSize"] = Convert.ToString(query.Argument.PageSize);
            string queryString = null;
            using (var tempContent = new FormUrlEncodedContent(queryKeyValues))
            {
                //why use this?  It handles the url encoding - and doesn't require System.Web (another popular
                //solution uses HttpUtility.ParseQueryString - but client code has no business referencing System.Web).
                queryString = await tempContent.ReadAsStringAsync();
            }

            return await _requestManager.Get<ApiServiceResponse<PagedResult<MyObject>>>(string.Concat("api/MyObjects?", queryString), query);
        }
Пример #43
0
        public IAsyncResult BeginSendRequest(IServiceRequest request, AsyncCallback callback, object callbackData)
        {
            HttpResponseMessage response = null;

            try
            {
                ByteArrayContent content = new ByteArrayContent(BinaryEncoder.EncodeMessage(request, m_quotas.MessageContext));
                content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

                AsyncResult result = new AsyncResult(callback, callbackData, m_operationTimeout, request, null);
                m_client.Timeout = TimeSpan.FromMilliseconds(m_operationTimeout);
                Task.Run(async() =>
                {
                    try
                    {
                        response = await m_client.PostAsync(m_url, content);
                        response.EnsureSuccessStatusCode();
                    }
                    catch (Exception ex)
                    {
                        Utils.Trace("Exception sending HTTPS request: " + ex.Message);
                        result.Exception = ex;
                        response         = null;
                    }
                    result.Response = response;
                    result.OperationCompleted();
                });

                return(result);
            }
            catch (Exception ex)
            {
                Utils.Trace("Exception sending HTTPS request: " + ex.Message);
                AsyncResult result = new AsyncResult(callback, callbackData, m_operationTimeout, request, response);
                result.Exception = ex;
                result.OperationCompleted();
                return(result);
            }
        }
Пример #44
0
        /// <inheritdoc/>
        public IServiceResponse Execute(IServiceRequest request)
        {
            HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(BuildUri(request));
            webReq.Method = request.Method;
            webReq.UserAgent = MistyService.Version;
            webReq.Accept = MistyService.GetContentType(request.Format);
            if (_timeout != 0)
                webReq.Timeout = _timeout;

            NameValueCollection headers = request.Headers;
            if (headers != null)
            {
                foreach (String key in headers.Keys)
                {
                    webReq.Headers[key] = headers[key];
                }
            }

            if (request.Body != null &&
                ("POST".Equals(request.Method, StringComparison.OrdinalIgnoreCase)
                || "PUT".Equals(request.Method, StringComparison.OrdinalIgnoreCase)))
            {
                using (Stream stream = webReq.GetRequestStream())
                using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF8))
                {
                    writer.Write(request.Body);
                }
            }

            try
            {
                return new HttpResponse(request.Resource, (HttpWebResponse)webReq.GetResponse());
            }
            catch (WebException e)
            {
                return new HttpResponse(request.Resource, (HttpWebResponse)e.Response);
            }
        }
        /// <inheritdoc/>
        public IAsyncResult BeginSendRequest(IServiceRequest request, AsyncCallback callback, object callbackData)
        {
            HttpResponseMessage response = null;

            try
            {
                ByteArrayContent content = new ByteArrayContent(BinaryEncoder.EncodeMessage(request, m_quotas.MessageContext));
                content.Headers.ContentType = m_mediaTypeHeaderValue;

                var result = new HttpsAsyncResult(callback, callbackData, m_operationTimeout, request, null);
                Task.Run(async() => {
                    try
                    {
                        var ct   = new CancellationTokenSource(m_operationTimeout).Token;
                        response = await m_client.PostAsync(m_url, content, ct);
                        response.EnsureSuccessStatusCode();
                    }
                    catch (Exception ex)
                    {
                        Utils.Trace("Exception sending HTTPS request: " + ex.Message);
                        result.Exception = ex;
                        response         = null;
                    }
                    result.Response = response;
                    result.OperationCompleted();
                });

                return(result);
            }
            catch (Exception ex)
            {
                Utils.Trace("Exception sending HTTPS request: " + ex.Message);
                HttpsAsyncResult result = new HttpsAsyncResult(callback, callbackData, m_operationTimeout, request, response);
                result.Exception = ex;
                result.OperationCompleted();
                return(result);
            }
        }
        public IServiceResponse Post(IServiceRequest request)
        {
            if (Auth != null)
                client.Authenticator = Auth;

            var restRequest = new RestRequest(request.Uri, Method.POST);

            if (!string.IsNullOrWhiteSpace(request.Body))
            {
                restRequest.AddParameter("text/json", request.Body, ParameterType.RequestBody);
                restRequest.RequestFormat = DataFormat.Json;
            }

            var response = client.Execute(restRequest);

            return new ServiceResponse
            {
                Data = response.Content,
                StatusCode = response.StatusCode,
                ErrorException = response.ErrorException,
                ErrorMessage = response.ErrorMessage
            };
        }
Пример #47
0
        IServiceRequest PopulateModelBinding(IOperationDescriptor operationDesc, IServiceRequest req, IServiceResponse resp)
        {
            if (req.Arguments == null)
            {
                return(req);
            }

            //备份原始请求参数
            req.Context["RawArguments"] = req.Arguments;

            var data   = operationDesc.GetParameterValues(req.Arguments);
            var tmpReq = ServiceRequest.Create(req.ServiceName, req.OperationName, data);

            tmpReq.ValidateRequest = req.ValidateRequest;

            if (tmpReq.Arguments.ContainsKey("AutoCloseServiceContext"))
            {
                tmpReq.Arguments.Remove("AutoCloseServiceContext");
            }
            tmpReq.Context = req.Context;

            return(tmpReq);
        }
Пример #48
0
            /// <summary>
            /// Begins processing an incoming request.
            /// </summary>
            /// <param name="handler">The method which sends the request.</param>
            /// <param name="request">The request.</param>
            /// <returns>The result object that is used to call the EndSendRequest method.</returns>
            public IAsyncResult BeginSendRequest(
                ChannelSendRequestEventHandler handler,
                IServiceRequest request)
            {
                m_handler = handler;
                m_request = request;

                try
                {
                    // queue request.
                    m_channel.ScheduleOutgoingRequest(this);
                }
                catch (Exception e)
                {
                    m_error    = e;
                    m_response = null;

                    // operation completed.
                    OperationCompleted();
                }

                return(this);
            }
Пример #49
0
        /// <summary>
        /// Returns the appropriate code for a Request provided one exists.
        /// Otherwise return null
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        private string GetCodeFromRequest(IServiceRequest request)
        {
            using (var context = new ServiceFulfillmentEngineContext())
            {
                IEnumerable <Script> highPriorityScripts = null;
                IEnumerable <Script> lowPriorityScripts  = null;
                try
                {
                    //get scripts
                    highPriorityScripts = from s in context.Scripts where s.Priority == Priority.High select s;
                    lowPriorityScripts  = from s in context.Scripts where s.Priority == Priority.Low select s;
                }
                catch (Exception) { /* database empty or other db problem */ }

                string code = null;
                //try high priority codes available first

                if (highPriorityScripts != null)
                {
                    code = (from r in request.ServiceRequestOptions
                            where
                            r.Code ==
                            (from s in highPriorityScripts where s.ApplicableCode == r.Code select s.ApplicableCode).FirstOrDefault()
                            select r.Code).FirstOrDefault();
                }

                //if not try for a lower priority codes
                if (code == null && lowPriorityScripts != null)
                {
                    code = (from r in request.ServiceRequestOptions
                            where
                            r.Code == (from s in lowPriorityScripts where s.ApplicableCode == r.Code select s.ApplicableCode).FirstOrDefault()
                            select r.Code).FirstOrDefault();
                }
                return(code);
            }
        }
Пример #50
0
        private IEnumerator _Process(IServiceRequest request)
        {
            if (request != null && request.data is ResultVO)
            {
                this._isRequesting = true;
                this._timeOutTimer.Start();
                ResultVO requestVO = request.data as ResultVO;

                if (requestVO.result is WWWForm)
                {
                    this._www = new WWW(this.URL, requestVO.result as WWWForm);
                }
                else
                {
                    this._www = new WWW(this.URL);
                }

                yield return(this._www);

                string resultCode = String.IsNullOrEmpty(this._www.error) ? ErrorCode.NONE : ErrorCode.PARAMETER_ERROR;
                string resultData = resultCode == ErrorCode.NONE ? this._www.text : this._www.error;

                if (this._www != null && !string.IsNullOrEmpty(this._www.error))
                {
                    Tracer.Echo("HTTPConnection : _Process : error : " + this._www.error);
                }

                this.Result(new ResultVO(requestVO.id, requestVO.service, resultCode, resultData, requestVO.uniqueID));
                yield return(true);
            }
            else
            {
                Tracer.Echo("HTTPConnection : _Process : unknown data!");
                yield return(false);
            }
        }
Пример #51
0
        /// <summary>
        /// Instantiates the service described by the <paramref name="serviceRequest"/>.
        /// </summary>
        /// <param name="serviceRequest">The <see cref="IServiceRequest"/> that describes the service that needs to be instantiated.</param>
        /// <returns>A valid object reference if the service can be found; otherwise, it will return <c>null</c>.</returns>
        public virtual object GetService(IServiceRequest serviceRequest)
        {
            // Allow users to intercept the instantiation process
            if (_preProcessor != null)
            {
                _preProcessor.Preprocess(serviceRequest);
            }

            var factoryRequest = new FactoryRequest
            {
                ServiceType = serviceRequest.ServiceType,
                ServiceName = serviceRequest.ServiceName,
                Arguments   = serviceRequest.ActualArguments,
                Container   = _container
            };

            var instance = _creator.CreateFrom(factoryRequest, serviceRequest.ActualFactory);

            // Postprocess the results
            var result = new ServiceRequestResult
            {
                ServiceName         = serviceRequest.ServiceName,
                ActualResult        = instance,
                Container           = _container,
                OriginalResult      = instance,
                ServiceType         = serviceRequest.ServiceType,
                AdditionalArguments = serviceRequest.ActualArguments
            };

            if (_postProcessor != null)
            {
                _postProcessor.PostProcess(result);
            }

            return(result.ActualResult ?? result.OriginalResult);
        }
// ***START***
    #region _NAME_ Service
#if (!OPCUA_EXCLUDE__NAME_)
/// <summary>
/// Invokes the _NAME_ service.
/// </summary>
    public IServiceResponse _NAME_(IServiceRequest incoming)
    {
        _NAME_Response response = null;

        try
        {
            OnRequestReceived(incoming);

            _NAME_Request request = (_NAME_Request)incoming;

            // DeclareResponseParameters

            response = new _NAME_Response();

            InvokeService();
            // SetResponseParameters
        }
        finally
        {
            OnResponseSent(response);
        }

        return(response);
    }
Пример #53
0
        /// <summary>
        /// Builds a RestRequest and executes it for the Prometheus API
        /// </summary>
        /// <param name="method">Type of call to make</param>
        /// <param name="serviceRequest">Request for body of call</param>
        /// <param name="requestId">ID to add to URI of the call</param>
        /// <returns>Result of the RestRequest made</returns>
        private IRestResponse Request(Method method, IServiceRequest serviceRequest, int requestId = 0)
        {
            var url = $"{_apiString}/Request";

            if (requestId != 0)
            {
                url += $"/{requestId}";
            }

            var client  = new RestClient(url);
            var request = new RestRequest(method);

            request.AddHeader("Username", _username);
            request.AddHeader("Password", _password);

            if (serviceRequest != null)
            {
                request.RequestFormat = DataFormat.Json;
                var serializedRequest = JsonConvert.SerializeObject(serviceRequest);
                request.AddBody(serializedRequest);
            }

            return(client.Execute(request));
        }
Пример #54
0
 public static IRequestHandler GetHandler(IServiceRequest request, IEAEPMonitorStore monitorStore)
 {
     switch (request.Extension.ToLower())
     {
         case ".json":
             switch (request.ResourceName.ToLower())
             {
                 case "count.json":
                     return new CountService(monitorStore);
                 case "distinct.json":
                     return new DistinctService(monitorStore);
                 default:
                     return new SearchService(monitorStore);
             }
         default:
             switch (request.ResourceName.ToLower())
             {
                 case "event":
                     return new EventService(monitorStore);
                 default:
                     return new SearchPage(monitorStore);
             }
     }
 }
Пример #55
0
        /// <summary>
        /// Handles requests arriving from a channel.
        /// </summary>
        public async void SendAsync(HttpContext context)
        {
            IAsyncResult result = null;

            try
            {
                if (m_callback == null)
                {
                    context.Response.ContentLength = 0;
                    context.Response.ContentType   = "text/plain";
                    context.Response.StatusCode    = (int)HttpStatusCode.NotImplemented;
                    await context.Response.WriteAsync(string.Empty);

                    return;
                }

                byte[] buffer = new byte[(int)context.Request.ContentLength];
                lock (m_lock)
                {
                    Task <int> task = context.Request.Body.ReadAsync(buffer, 0, (int)context.Request.ContentLength);
                    task.Wait();
                }

                IServiceRequest input = (IServiceRequest)BinaryDecoder.DecodeMessage(buffer, null, m_quotas.MessageContext);

                // extract the JWT token from the HTTP headers.
                if (input.RequestHeader == null)
                {
                    input.RequestHeader = new RequestHeader();
                }

                if (NodeId.IsNull(input.RequestHeader.AuthenticationToken) && input.TypeId != DataTypeIds.CreateSessionRequest)
                {
                    if (context.Request.Headers.Keys.Contains("Authorization"))
                    {
                        foreach (string value in context.Request.Headers["Authorization"])
                        {
                            if (value.StartsWith("Bearer"))
                            {
                                input.RequestHeader.AuthenticationToken = new NodeId(value.Substring("Bearer ".Length).Trim());
                            }
                        }
                    }
                }

                EndpointDescription endpoint = null;

                foreach (var ep in m_descriptions)
                {
                    if (ep.EndpointUrl.StartsWith(Utils.UriSchemeHttps))
                    {
                        endpoint = ep;
                        break;
                    }
                }

                result = m_callback.BeginProcessRequest(
                    m_listenerId,
                    endpoint,
                    input as IServiceRequest,
                    null,
                    null);

                IServiceResponse output = m_callback.EndProcessRequest(result);

                byte[] response = BinaryEncoder.EncodeMessage(output, m_quotas.MessageContext);
                context.Response.ContentLength = response.Length;
                context.Response.ContentType   = context.Request.ContentType;
                context.Response.StatusCode    = (int)HttpStatusCode.OK;
                await context.Response.Body.WriteAsync(response, 0, response.Length);
            }
            catch (Exception e)
            {
                Utils.Trace(e, "HTTPSLISTENER - Unexpected error processing request.");
                context.Response.ContentLength = e.Message.Length;
                context.Response.ContentType   = "text/plain";
                context.Response.StatusCode    = (int)HttpStatusCode.InternalServerError;
                await context.Response.WriteAsync(e.Message);
            }
        }
Пример #56
0
 public void RemoveCompletedRequest(IServiceRequest reqid)
 {
     HttpRequestClass req = (HttpRequestClass) reqid;
     lock (HttpListLock)
     {
         List<HttpRequestClass> tmpReqs;
         if (m_pendingRequests.TryGetValue(req.ItemID, out tmpReqs))
         {
             for (int i = 0; i < tmpReqs.Count; i++)
             {
                 if (tmpReqs[i].ReqID == req.ReqID)
                 {
                     tmpReqs[i].Stop();
                     tmpReqs.RemoveAt(i);
                 }
             }
             if (tmpReqs.Count == 1)
                 m_pendingRequests.Remove(req.ItemID);
             else
                 m_pendingRequests[req.ItemID] = tmpReqs;
         }
     }
 }
Пример #57
0
        public bool Check()
        {
            bool needToContinue = false;

            foreach (IHttpRequestModule iHttpReq in m_modules)
            {
                IServiceRequest httpInfo = null;

                if (iHttpReq != null)
                {
                    httpInfo = iHttpReq.GetNextCompletedRequest();
                    if (!needToContinue)
                    {
                        needToContinue = iHttpReq.GetRequestCount() > 0;
                    }
                }

                if (httpInfo == null)
                {
                    continue;
                }

                while (httpInfo != null)
                {
                    IHttpRequestClass info = (IHttpRequestClass)httpInfo;
                    //MainConsole.Instance.Debug("[AsyncLSL]:" + httpInfo.response_body + httpInfo.status);

                    // Deliver data to prim's remote_data handler

                    iHttpReq.RemoveCompletedRequest(info);

                    object[] resobj =
                    {
                        new LSL_Types.LSLString(info.ReqID.ToString()),
                        new LSL_Types.LSLInteger(info.Status),
                        new LSL_Types.list(info.Metadata),
                        new LSL_Types.LSLString(info.ResponseBody)
                    };

                    m_ScriptEngine.AddToObjectQueue(info.PrimID, "http_response", new DetectParams[0], resobj);
                    if (info.Status == 499 && //Too many for this prim
                        info.VerbroseThrottle)
                    {
                        ISceneChildEntity part = m_ScriptEngine.Scene.GetSceneObjectPart(info.PrimID);
                        if (part != null)
                        {
                            IChatModule chatModule = m_ScriptEngine.Scene.RequestModuleInterface <IChatModule>();
                            if (chatModule != null)
                            {
                                chatModule.SimChat(
                                    part.Name + "(" + part.AbsolutePosition +
                                    ") http_response error: Too many outgoing requests.", ChatTypeEnum.DebugChannel,
                                    2147483647, part.AbsolutePosition, part.Name, part.UUID, false, m_ScriptEngine.Scene);
                            }
                        }
                    }
                    httpInfo = iHttpReq.GetNextCompletedRequest();
                }
            }
            return(needToContinue);
        }
        /// <summary>
        /// Begins processing a request received via a binary encoded channel.
        /// </summary>
        /// <param name="channeId">A unique identifier for the secure channel which is the source of the request.</param>
        /// <param name="endpointDescription">The description of the endpoint which the secure channel is using.</param>
        /// <param name="request">The incoming request.</param>
        /// <param name="callback">The callback.</param>
        /// <param name="callbackData">The callback data.</param>
        /// <returns>
        /// The result which must be passed to the EndProcessRequest method.
        /// </returns>
        /// <seealso cref="EndProcessRequest"/>
        /// <seealso cref="ITransportListener"/>
        public IAsyncResult BeginProcessRequest(
            string channeId,
            EndpointDescription endpointDescription,
            IServiceRequest request,
            AsyncCallback callback,
            object callbackData)
        {
            if (channeId == null) throw new ArgumentNullException("channeId");
            if (request == null) throw new ArgumentNullException("request");

            // create operation.
            ProcessRequestAsyncResult result = new ProcessRequestAsyncResult(this, callback, callbackData, 0);

            SecureChannelContext context = new SecureChannelContext(
                channeId,
                endpointDescription,
                RequestEncoding.Binary);

            // begin invoke service.
            return result.BeginProcessRequest(context, request);
        }
 /// <summary>
 /// Creates an audit log entry for the request.
 /// </summary>
 /// <param name="request">The request.</param>
 /// <returns>log entry</returns>
 protected virtual string CreateAuditLogEntry(IServiceRequest request)
 {
     return(request.RequestHeader.AuditEntryId);
 }
Пример #60
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="req"></param>
        /// <param name="operationDesc"></param>
        /// <returns></returns>
        protected virtual IServiceResponse OnExecute(IServiceRequest req, IOperationDescriptor operationDesc)
        {
            var resp = new ServiceResponse();
            //得到领域服务元数据
            var serviceDesc        = operationDesc.ServiceDescriptor;
            var svrResolvedContext = new ServiceResolvedContext(serviceDesc, req, resp);

            ServiceContext.Current = new ServiceContext {
                Request = req, Response = resp
            };

            try
            {
                ListenManager.OnServiceDescriptorFound(svrResolvedContext);
                if (svrResolvedContext.Cancelled)
                {
                    return(resp);
                }

                svrResolvedContext.OperationDescriptor = operationDesc;
                ListenManager.OnOperationDescriptorFound(svrResolvedContext);
                if (svrResolvedContext.Cancelled)
                {
                    return(resp);
                }
            }
            catch (Exception ex)
            {
                resp.AddException(ex);
                return(resp);
            }

            object service = null;

            try
            {
                service = ServiceLocator(serviceDesc.Id);
            }
            catch (Exception ex)
            {
                resp.AddException(new ServiceDispatcherException(ServiceDispatcherExceptionCode.CreateServiceException, ex)
                {
                    ServiceName   = req.ServiceName,
                    OperationName = req.OperationName
                });
                return(resp);
            }

            svrResolvedContext.Service = service;
            ListenManager.OnServiceResolved(svrResolvedContext);
            if (svrResolvedContext.Cancelled)
            {
                return(resp);
            }

            try
            {
                req = PopulateModelBinding(operationDesc, req, resp);
            }
            catch (Exception ex)
            {
                resp.AddException(new ServiceDispatcherException(ServiceDispatcherExceptionCode.ParameterBindException, ex)
                {
                    ServiceName   = req.ServiceName,
                    OperationName = req.OperationName
                });
                return(resp);
            }

            try
            {
                if (!ValidateParamters(operationDesc, req, resp))
                {
                    resp.AddException(new ServiceDispatcherException(ServiceDispatcherExceptionCode.ModelValidationException)
                    {
                        ServiceName   = req.ServiceName,
                        OperationName = req.OperationName
                    });
                    return(resp);
                }
            }
            catch (Exception ex)
            {
                resp.AddException(new ServiceDispatcherException(ServiceDispatcherExceptionCode.ModelValidationException, ex)
                {
                    ServiceName   = req.ServiceName,
                    OperationName = req.OperationName
                });
                return(resp);
            }

            //创建操作上下文对象
            var ctx = new OperationExecutedContext(req, operationDesc)
            {
                Response = resp
            };

            try
            {
                //执行前置过滤器
                OnBeforeAction(service, ctx);

                //如果过滤器进行了必要的拦截则返回
                if ((ctx as IOperationExecutingContext).Cancelled)
                {
                    return(resp);
                }

                //调用领域服务方法
                resp.Result = operationDesc.Invoke(service, ctx.Arguments.Values.ToArray());

                ctx.Service = service;

                //执行后置过滤器
                OnAfterAction(ctx);
                resp.Success = true;
            }
            catch (Exception ex)
            {
                resp.AddException(ex);
            }

            return(resp);
        }