扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
1 public void ProcessRequest(HttpContext context) 2 { 3 // 根据Web Services的Cache设置来配置Cache策略 4 this.InitializeCachePolicy(context); 5 6 try 7 { 8 string contentType; 9 10 // 从body的JSON字符串中得到输入的参数。 11 IDictionary<string, object> inputParams = this.GetRawParams(context); 12 13 // this._webServiceMethodData.Ower.Type即获得了即将调用的那个 14 // Web Service类,通过Activator.CreateInstance方法构造实例。 15 object serviceObj = Activator.CreateInstance(this._webServiceMethodData.Owner.Type); 16 17 // 这是一段很有技巧的代码,我们目前不去分析它。 18 DataService service = serviceObj as DataService; 19 if (service != null) 20 { 21 service.IsCalledRemotely = true; 22 } 23 24 // Call这个Web Service方法来得到结果 25 object resultObj = this._webServiceMethodData.CallMethodFromRawParams(serviceObj, inputParams); 26 27 …… 28 } 29 catch (Exception e) 30 { 31 …… 32 } 33 } |
1 private IDictionary<string, object> GetRawParams(HttpContext context) 2 { 3 // 如果是Cross Domain Access,则抛出异常 4 if (!this._webServiceMethodData.SafeForCrossDomain && ChildRequest.IsCrossDomainRequest(context)) 5 { 6 throw new InvalidOperationException( 7 string.Format( 8 CultureInfo.CurrentCulture, 9 AtlasWeb.InvalidCrossDomainRequest, 10 new object[] { this._webServiceMethodData.MethodInfo.Name })); 11 } 12 13 // 如果使用HTTP POST方法 14 if (context.Request.HttpMethod == "POST") 15 { 16 // 则通过Body中的JSON代码获得参数 17 return this.GetRawParamsFromPostRequest(context); 18 } 19 20 // 由于使用了HTTP GET方法,需要看一下Web Services方法是否允许GET操作 21 if (!this._webServiceMethodData.GetVerbEnabled) 22 { 23 throw new InvalidOperationException( 24 string.Format( 25 CultureInfo.CurrentCulture, 26 AtlasWeb.InvalidGetRequest, 27 new object[] { this._webServiceMethodData.MethodInfo.Name })); 28 } 29 30 // 从Query String中获得参数 31 return this.GetRawParamsFromGetRequest(context); 32 } |
1 internal object CallMethodFromRawParams(object target, IDictionary<string, object> parameters) 2 { 3 // 获得强类型的参数字典 4 parameters = this.StrongTypeParameters(parameters); 5 return this.CallMethod(target, parameters); 6 } |
1 public void ProcessRequest(HttpContext context) 2 { 3 …… 4 5 try 6 { 7 …… 8 9 // 如果这个Web Service方法被要求使用XML作为Response 10 if (this._webServiceMethodData.UseXmlResponse) 11 { 12 // 如果result是String,那么直接输出 13 if (resultObj is string) 14 { 15 body = (string) resultObj; 16 } 17 else if (resultObj is XmlNode) 18 { 19 // 如果是一段XML,则输出它的OuterXml 20 body = ((XmlNode) resultObj).OuterXml; 21 } 22 else // 如果只是一个普通的对象 23 { 24 try 25 { 26 // 使用XmlSerializer来序列化对象 27 body = ServicesUtilities.XmlSerializeObjectToString(resultObj); 28 } 29 catch (Exception e) 30 { 31 throw new InvalidOperationException( 32 string.Format( 33 CultureInfo.CurrentCulture, 34 AtlasWeb.InvalidXmlReturnType, 35 new object[] { 36 this._webServiceMethodData.MethodInfo.Name, 37 resultObj.GetType().FullName, 38 e.Message 39 } 40 ) 41 ); 42 } 43 } 44 45 // contentType为"text/xml" 46 contentType = "text/xml"; 47 } 48 else // 如果不以Xml输出 49 { 50 // 那么以JSON方式输出 51 body = JavaScriptObjectSerializer.Serialize(resultObj, this._webServiceMethodData.Owner); 52 // contentType为"application/json" 53 contentType = "application/json"; 54 } 55 56 // 设置ContentType 57 context.Response.ContentType = contentType; 58 // 输出body 59 if (body != null) 60 { 61 context.Response.Write(body); 62 } 63 } 64 catch (Exception e) 65 { 66 …… 67 } 68 } |
[WebOperation(false, ResponseFormatMode.Xml)] |
1 public void ProcessRequest(HttpContext context) 2 { 3 …… 4 5 try 6 { 7 …… 8 } 9 catch (Exception e) 10 { 11 // 输出异常信息 12 context.Response.ClearHeaders(); 13 context.Response.Clear(); 14 // Status Code设为500 15 context.Response.StatusCode = 500; 16 context.Response.StatusDescription = HttpWorkerRequest.GetStatusDescription(500); 17 using (StreamWriter writer = new StreamWriter(context.Response.OutputStream, new UTF8Encoding(false))) 18 { 19 // 以JSON方式输出异常信息 20 RestHandler.WriteExceptionJsonString(context, writer, e); 21 return; 22 } 23 } 24 } |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者