Exemplo n.º 1
0
        private void AcceptClient(IAsyncResult ar)
        {
            try
            {
                using (HTTPServerSession session = new HTTPServerSession(_socket.EndAccept(ar), _params))
                {
                    ManualResetEvent evt = ar.AsyncState as ManualResetEvent;
                    evt.Set();

                    while (session.HasMoreRequests)
                    {
                        try
                        {
                            HTTPServerResponse response = new HTTPServerResponse(session);
                            HTTPServerRequest  request  = new HTTPServerRequest(session);

                            response.Version   = request.Version;
                            response.KeepAlive = session.CanKeepAlive && request.KeepAlive && _params.KeepAlive;

                            try
                            {
                                IHTTPRequestHandler handler = _factory.CreateRequestHandler(request);
                                if (handler != null)
                                {
                                    if (request.ExpectsContinue)
                                    {
                                        response.SendContinue();
                                    }

                                    handler.HandleRequest(request, response);
                                    session.KeepAlive = response.KeepAlive && session.CanKeepAlive && _params.KeepAlive;
                                }
                                else
                                {
                                    SendErrorResponse(session, HTTPServerResponse.HTTPStatus.HTTP_NOT_IMPLEMENTED);
                                }
                            }
                            catch (Exception ex)
                            {
                                if (!response.Sent)
                                {
                                    SendErrorResponse(session, HTTPServerResponse.HTTPStatus.HTTP_INTERNAL_SERVER_ERROR);
                                }

                                OnServerException(ex);
                                break;
                            }
                        }
                        catch (HTTPNoMessageException) { break; }
                        catch (HTTPMessageException)
                        {
                            SendErrorResponse(session, HTTPServerResponse.HTTPStatus.HTTP_BAD_REQUEST);
                            break;
                        }
                    }
                }
            }
            catch (Exception)
            { }
        }
 /// <summary>
 /// 返回请求句柄
 /// </summary>
 /// <param name="request"></param>
 /// <returns></returns>
 public IHTTPRequestHandler CreateRequestHandler(HTTPServerRequest request)
 {
     //不是HttpGET或HttpPOST方式,直接返回
     if (request.Method == HTTPServerRequest.HTTP_GET || request.Method == HTTPServerRequest.HTTP_POST)
         return handler;
     else
         return null;
 }
        /// <summary>
        /// 实现Request响应
        /// </summary>
        /// <param name="request"></param>
        /// <param name="response"></param>
        public void HandleRequest(HTTPServerRequest request, HTTPServerResponse response)
        {
            /**
                     * In this example we'll write the body into the
                     * stream obtained by response.Send(). This will cause the
                     * KeepAlive to be false since the size of the body is not
                     * known when the response header is sent.
                     **/

            if (request.URI.ToLower() == "/favicon.ico")
            {
                response.ContentType = "text/html;charset=utf-8";
                response.StatusAndReason = HTTPServerResponse.HTTPStatus.HTTP_NOT_FOUND;
                response.SendContinue();
            }
            else if (request.URI.ToLower() == "/api")
            {
                response.ContentType = "application/json;charset=utf-8";
                SendResponse(response, caller.GetAPIText());
            }
            else if (request.URI.ToLower() == "/help")
            {
                //发送文档帮助信息
                response.ContentType = "text/html;charset=utf-8";
                response.StatusAndReason = HTTPServerResponse.HTTPStatus.HTTP_OK;
                SendResponse(response, caller.GetDocument(null));
            }
            else if (request.URI.ToLower().IndexOf("/help/") == 0)
            {
                //发送文档帮助信息
                response.ContentType = "text/html;charset=utf-8";
                response.StatusAndReason = HTTPServerResponse.HTTPStatus.HTTP_OK;
                var name = request.URI.Substring(request.URI.IndexOf("/help/") + 6);
                SendResponse(response, caller.GetDocument(name));
            }
            else if (request.URI.Substring(request.URI.IndexOf('/') + 1).Length > 5)
            {
                HandleResponse(request, response);
            }
            else
            {
                response.StatusAndReason = HTTPServerResponse.HTTPStatus.HTTP_NOT_ACCEPTABLE;
                var error = new HttpServiceResult { Message = response.Reason };
                SendResponse(response, error);
            }
        }
        private void HandleResponse(HTTPServerRequest request, HTTPServerResponse response)
        {
            //响应格式
            response.ContentType = "application/json;charset=utf-8";

            var pathAndQuery = request.URI.TrimStart('/');
            var array = pathAndQuery.Split('?');
            var methodName = array[0];
            var paramString = array.Length > 1 ? array[1] : null;
            var callMethod = caller.GetCaller(methodName);

            if (callMethod == null)
            {
                response.StatusAndReason = HTTPServerResponse.HTTPStatus.HTTP_NOT_FOUND;
                var error = new HttpServiceResult { Message = string.Format("{0}【{1}】", response.Reason, methodName) };
                SendResponse(response, error);
                return;
            }
            else if (callMethod.HttpMethod == HttpMethod.POST && request.Method.ToUpper() == "GET")
            {
                response.StatusAndReason = HTTPServerResponse.HTTPStatus.HTTP_METHOD_NOT_ALLOWED;
                var error = new HttpServiceResult { Message = response.Reason };
                SendResponse(response, error);
                return;
            }

            try
            {
                //调用方法
                NameValueCollection nvs = null;
                if (callMethod.HttpMethod == HttpMethod.GET)
                {
                    nvs = HttpUtility.ParseQueryString(paramString ?? string.Empty, Encoding.UTF8);
                }
                else
                {
                    //接收流内部数据
                    var stream = request.GetRequestStream();

                    //接收流内部数据
                    var sr = new StreamReader(stream, Encoding.UTF8);
                    string streamValue = sr.ReadToEnd();

                    //转换成NameValueCollection
                    nvs = ConvertCollection(streamValue);
                }

                if (callMethod.Authorized)
                {
                    if (!request.Has("X-AuthParameter"))
                        throw new AuthorizeException("Request header did not exist [X-AuthParameter] info.");
                    else
                        //调用认证的信息
                        nvs[callMethod.AuthParameter] = request.Get("X-AuthParameter");
                }

                //转换成JsonString
                var parameters = ConvertJsonString(nvs);
                string jsonString = caller.CallMethod(methodName, parameters);

                if (callMethod.TypeString)
                {
                    //如果返回是字符串类型,则设置为文本返回
                    response.ContentType = "text/plain;charset=utf-8";

                    //转换成string类型
                    jsonString = SerializationManager.DeserializeJson<string>(jsonString);
                }

                SendResponse(response, jsonString);
            }
            catch (HTTPMessageException ex)
            {
                response.StatusAndReason = HTTPServerResponse.HTTPStatus.HTTP_EXPECTATION_FAILED;
                var error = new HttpServiceResult { Message = string.Format("{0} - {1}", response.Reason, ex.Message) };
                SendResponse(response, error);
            }
            catch (Exception ex)
            {
                response.StatusAndReason = HTTPServerResponse.HTTPStatus.HTTP_BAD_REQUEST;
                var e = ErrorHelper.GetInnerException(ex);
                var error = new HttpServiceResult { Message = string.Format("{0} - {1}", e.GetType().Name, e.Message) };
                SendResponse(response, error);
            }
        }
Exemplo n.º 5
0
        private void AcceptClient(IAsyncResult ar)
        {
            try
            {
                using (HTTPServerSession session = new HTTPServerSession(_socket.EndAccept(ar), _params))
                {
                    ManualResetEvent evt = ar.AsyncState as ManualResetEvent;
                    evt.Set();

                    while (session.HasMoreRequests)
                    {
                        try
                        {
                            HTTPServerResponse response = new HTTPServerResponse(session);
                            HTTPServerRequest request = new HTTPServerRequest(session);

                            response.Version = request.Version;
                            response.KeepAlive = session.CanKeepAlive && request.KeepAlive && _params.KeepAlive;

                            try
                            {
                                IHTTPRequestHandler handler = _factory.CreateRequestHandler(request);
                                if (handler != null)
                                {
                                    if (request.ExpectsContinue)
                                        response.SendContinue();

                                    handler.HandleRequest(request, response);
                                    session.KeepAlive = response.KeepAlive && session.CanKeepAlive && _params.KeepAlive;
                                }
                                else
                                    SendErrorResponse(session, HTTPServerResponse.HTTPStatus.HTTP_NOT_IMPLEMENTED);
                            }
                            catch (Exception ex)
                            {
                                if (!response.Sent)
                                    SendErrorResponse(session, HTTPServerResponse.HTTPStatus.HTTP_INTERNAL_SERVER_ERROR);

                                OnServerException(ex);
                                break;
                            }
                        }
                        catch (HTTPNoMessageException) { break; }
                        catch (HTTPMessageException)
                        {
                            SendErrorResponse(session, HTTPServerResponse.HTTPStatus.HTTP_BAD_REQUEST);
                            break;
                        }
                    }
                }
            }
            catch (Exception)
            { }
        }