/// <summary> /// 构造 /// </summary> /// <param name="requestUrl">API请求的URL</param> /// <param name="error">API调用失败的错误信息</param> public FileSyncRequestResultEventArgs(Uri requestUrl, FileSyncAPIRequestResult result, FileSyncError error) { RequestUrl = requestUrl; Result = result; Error = error; Response = null; }
private void AuthorizeFinish(object obj, FileSyncRequestResultEventArgs arg) { switch (arg.Result) { case FileSyncAPIRequestResult.Success: try { FileSyncAuthorizeInfo authInfo = new FileSyncAuthorizeInfo(); string xml = arg.Response; XmlDocument xd = new XmlDocument(); xd.LoadXml(xml); authInfo.AuthSid = xd.SelectSingleNode("/QDocRoot/authSid").InnerText; authInfo.UserName = xd.SelectSingleNode("/QDocRoot/username").InnerText; FileSync.CurrentUser.SaveUserSessionInfo(authInfo); if (tempCallback != null) { tempCallback(this, arg); } } catch (Exception ex) { if (tempCallback != null) { FileSyncError error = new FileSyncError(); error.error_code = requestErrorDomain; error.error_msg = "An error occurs when parse server response." + ex.Message; tempCallback(this, new FileSyncRequestResultEventArgs(null, FileSyncAPIRequestResult.Fail, error)); } } break; case FileSyncAPIRequestResult.Fail: if (tempCallback != null) { tempCallback(this, arg); } break; default: break; } }
/// <summary> /// 发起API请求 /// </summary> /// <param name="requestUrl">API请求的url,必须是https的</param> /// <param name="httpMethod">API的请求方式</param> /// <param name="requestParams">API的请求参数</param> public void APIRequest(string requestUrl, string httpMethod, Dictionary<string, object> requestParams) { if (requestUrl == null || requestUrl == "" /*|| !requestUrl.StartsWith("https")*/) { FileSyncError error = new FileSyncError(); error.error_code = requestErrorDomain; error.error_msg = "Request url is wrong."; if (DownloadStringCompleted != null) { DownloadStringCompleted(this, new FileSyncRequestResultEventArgs(null, FileSyncAPIRequestResult.Fail, error)); } return; } if (requestParams == null) { requestParams = new Dictionary<string, object>(); } if (!requestParams.ContainsKey("sid")) { requestParams.Add("sid", FileSync.CurrentUser.SessionID); } FileSyncAPIRequestFileParam fileParam = IsUploadFile(requestParams); if (fileParam != null) { requestParams.Remove(fileParam.FileKey); AsyncRequestAPIWithFile(requestUrl, httpMethod, requestParams, fileParam); } else { AsyncRequestAPI(requestUrl, httpMethod, requestParams); } }
/// <summary> /// 构造 /// </summary> /// <param name="result">授权结果</param> /// <param name="error">授权失败的错误信息</param> public FileSyncLoginResultEventArgs(FileSyncUserLoginResult result, FileSyncError error) { Result = result; Error = error; }
/// <summary> /// 请求上传图片API接口 /// </summary> /// <param name="requestUri">API请求的uri</param> /// <param name="httpMethod">API的请求方式</param> /// <param name="requestParams">API的请求参数</param> /// <param name="imageParam">图片参数</param> private void AsyncRequestAPIWithFile(string requestUri, string httpMethod, Dictionary<string, object> requestParams, FileSyncAPIRequestFileParam fileParam) { HttpWebRequest request = null; FileSyncAPIRequestState state = new FileSyncAPIRequestState(); try { requestUri = FileSyncUtility.AddParametersToURL(requestUri, requestParams); request = (HttpWebRequest)WebRequest.Create(new Uri(requestUri)); boundary = "----------" + DateTime.Now.Ticks.ToString("x"); byte[] beginBoundary = Encoding.UTF8.GetBytes(string.Format("--{0}\r\n", boundary)); string fileTemplate = "Content-Disposition: form-data; name=\"file\"; filename=\"{0}\"\r\nContent-Type: application/octet-stream\r\n\r\n"; byte[] bfile = Encoding.UTF8.GetBytes(String.Format(fileTemplate, fileParam.FileKey)); byte[] endBoundary = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n"); request.Method = httpMethod; request.ContentType = "multipart/form-data; boundary=" + boundary; request.ContentLength = beginBoundary.Length + bfile.Length + fileParam.FileData.Length + endBoundary.Length; request.AllowWriteStreamBuffering = false; request.Timeout = 300000; state.request = request; state.requestParams = requestParams; state.fileParam = fileParam; state.beginBoundary = beginBoundary; state.bfile = bfile; state.endBoundary = endBoundary; request.BeginGetRequestStream(new AsyncCallback(RequestReadyWithFile), state); } catch (Exception ex) { if (DownloadStringCompleted != null) { FileSyncError error = new FileSyncError(); error.error_code = requestErrorDomain; error.error_msg = "A Error Occurred While Creating HTTP Web Request. " + ex.Message; //System.Windows.Deployment.Current.Dispatcher.BeginInvoke(delegate() // { if (DownloadStringCompleted != null) { DownloadStringCompleted(this, new FileSyncRequestResultEventArgs(request == null ? null : request.Address, FileSyncAPIRequestResult.Fail, error) { RequestParams = requestParams }); } // }); } } }
/// <summary> /// 处理API请求返回的信息 /// </summary> /// <param name="asyncResult">异步请求返回的结果</param> void ResponseReady(IAsyncResult asyncResult) { FileSyncAPIRequestState state = asyncResult.AsyncState as FileSyncAPIRequestState; HttpWebRequest request = state.request; HttpWebResponse response = null; try { response = (HttpWebResponse)request.EndGetResponse(asyncResult); string result = string.Empty; using (Stream responseStream = response.GetResponseStream()) { using (StreamReader reader = new StreamReader(responseStream)) { result = reader.ReadToEnd(); } } if (DownloadStringCompleted != null) { DownloadStringCompleted(this, new FileSyncRequestResultEventArgs(request == null ? null : request.Address, FileSyncAPIRequestResult.Success, result) { RequestParams = state.requestParams }); } } catch (Exception ex) { if (DownloadStringCompleted != null) { FileSyncError error = new FileSyncError(); error.error_code = requestErrorDomain; error.error_msg = "No response." + ex.Message; if (DownloadStringCompleted != null) { DownloadStringCompleted(this, new FileSyncRequestResultEventArgs(request == null ? null : request.Address, FileSyncAPIRequestResult.Fail, error) { RequestParams = state.requestParams }); } } } }
/// <summary> /// 请求普通API接口 /// </summary> /// <param name="requestUri">API请求的uri</param> /// <param name="httpMethod">API的请求方式</param> /// <param name="requestParams">API的请求参数</param> private void AsyncRequestAPI(string requestUri, string httpMethod, Dictionary<string, object> requestParams) { HttpWebRequest request = null; try { // POST if (httpMethod == "POST") { requestUri = FileSyncUtility.AddParametersToURL(requestUri, requestParams); FileSyncAPIRequestState state = new FileSyncAPIRequestState(); request = (HttpWebRequest)WebRequest.Create(requestUri); request.Method = httpMethod; request.ContentType = "application/x-www-form-urlencoded;charset=utf-8"; //平台统计用 request.UserAgent = "FileSync Windows SDK " + FileSync.Config.SDKVersion + "(windows; " + Environment.OSVersion.Platform + ")"; state.request = request; state.requestParams = requestParams; request.BeginGetRequestStream(new AsyncCallback(RequestReady), state); } else if (httpMethod == "GET") { requestUri = FileSyncUtility.AddParametersToURL(requestUri, requestParams); request = (HttpWebRequest)WebRequest.Create(requestUri); request.Method = httpMethod; FileSyncAPIRequestState state = new FileSyncAPIRequestState(); state.request = request; state.requestParams = requestParams; request.BeginGetResponse(ResponseReady, state); } } catch { if (DownloadStringCompleted != null) { FileSyncError error = new FileSyncError(); error.error_code = requestErrorDomain; error.error_msg = "A Error Occurred While Creating HTTP Web Request."; if (DownloadStringCompleted != null) { DownloadStringCompleted(this, new FileSyncRequestResultEventArgs(request == null ? null : request.Address, FileSyncAPIRequestResult.Fail, error)); } } } }