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); } }
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) { } }