类别:程序开发
日期:2022-06-07 浏览:2087 评论:0
由于医院环境需要,所有院内客户机无法连接医院前置服务器的WebService和一般处理程序,客户机只能通过院内服务器做中转,跳转到前端服务器WebService和一般处理程序上。
解决方案:
1、创建一个中转的一般处理程序
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Web; namespace WebApplication { /// <summary> /// AjaxHandler 的摘要说明 /// </summary> public class AjaxHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { string action = "GetAjaxPost"; context.Response.ContentType = "text/plain"; switch (action) { case "GetAjaxPost": GetAjaxPost(context); //Post提交 break; case "GetAjaxGet": GetAjaxGet(context); //Get提交 break; case "GetVs": GetVs(context); //测试 break; } } public void GetVs(HttpContext context) { string name = context.Request["name"].ToString(); context.Response.Write("1" + "name=" + name); } public void GetAjaxGet(HttpContext context) { string url = string.Empty; StringBuilder sb = new StringBuilder(); foreach (string key in context.Request.Params.AllKeys) { if (key == "HostUrl") { url = context.Request.Params[key]; } else { if (key == "username") { break; } sb.Append(string.Format("&{0}={1}", key, context.Request.Params[key])); } } string msg = sb.ToString().Substring(1, sb.Length - 1); GetValue(url, msg, context); } public void GetAjaxPost(HttpContext context) { string url = string.Empty; foreach (string key in context.Request.Params.AllKeys) { if (key == "HostUrl") { url = context.Request.Params[key]; } } GetValue(url, context); } //中间库Get提交 public void GetValue(string apiUrl, string queryString, HttpContext context) { string responseString = string.Empty; HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(apiUrl + "?" + queryString); request.ContentType = "text/html"; request.Method = "POST"; request.ContentLength = queryString.Length; request.Timeout = 20000; byte[] bytes = Encoding.UTF8.GetBytes(queryString); Stream os = null; try { // send the Post request.ContentLength = bytes.Length; //Count bytes to send os = request.GetRequestStream(); os.Write(bytes, 0, bytes.Length); //Send it } catch (WebException ex) { throw ex; } finally { if (os != null) { os.Close(); } } HttpWebResponse response = null; try { response = (HttpWebResponse)request.GetResponse(); using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { responseString = reader.ReadToEnd(); } } catch (Exception ex2) { throw ex2; } finally { if (response != null) response.Close(); } context.Response.Write(responseString); } //中间库Post提交 public void GetValue(string apiUrl, HttpContext context) { string responseString = string.Empty; HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(apiUrl); request.ContentType = "application/x-www-form-urlencoded;charset:utf-8"; request.Method = "POST"; StringBuilder paraStrBuilder = new StringBuilder(); foreach (string key in context.Request.Params.AllKeys) { paraStrBuilder.AppendFormat("{0}={1}&", key, context.Request.Params[key]); } string para = paraStrBuilder.ToString(); if (para.EndsWith("&")) para = para.Remove(para.Length - 1, 1); byte[] bt = Encoding.UTF8.GetBytes(para); string responseData = String.Empty; request.ContentLength = bt.Length; //GetRequestStream 输入流数据 using (Stream reqStream = request.GetRequestStream()) { reqStream.Write(bt, 0, bt.Length); reqStream.Close(); } using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { Stream stream = response.GetResponseStream(); using (StreamReader streamReader = new StreamReader(stream, Encoding.UTF8)) { responseString = streamReader.ReadToEnd().ToString(); } } context.Response.Write(responseString); } public bool IsReusable { get { return false; } } } }
2、创建中转WebService
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using WebApplication.Models; namespace WebApplication { /// <summary> /// WebService 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 // [System.Web.Script.Services.ScriptService] public class WebService : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"; } [WebMethod] public string AjaxWebService(string url, string action, string strArgs) { string[] argsArray = strArgs.Split('$'); string[] args = new string[argsArray.Length]; for (int i = 0; i < argsArray.Length; i++) { args[i] = argsArray[i]; } object result = WSHelper.InvokeWebService(url, action, args); return result.ToString(); } } }
3、测试过程和数据
测试调用的一般处理程序
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace WebApplication { /// <summary> /// Handler1 的摘要说明 /// </summary> public class Handler1 : IHttpHandler { public void ProcessRequest(HttpContext context) { string action = context.Request["action"].ToString(); context.Response.ContentType = "text/plain"; switch (action) { case "GetVs": GetVs(context); break; } } public void GetVs(HttpContext context) { string name = context.Request["name"].ToString(); context.Response.Write("1" + "name=" + name); } public bool IsReusable { get { return false; } } } }
测试调用的WebService
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; namespace WebApplication { /// <summary> /// WebService1 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 // [System.Web.Script.Services.ScriptService] public class WebService1 : System.Web.Services.WebService { [WebMethod] public string HelloWorld(string name,string text) { return "参数内容1:" + name + " 参数内容2:" + text; } } }
调用中转WebSerivce 和 一般处理程序
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using WebApplication.Models; namespace WebApplication { public partial class index : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //中转WebService地址 string url = "http://localhost:2064/WebService.asmx"; //中转WebService参数 string[] args = new string[3]; args[0] = "http://localhost:2064/WebService1.asmx"; //前端WebService地址 args[1] = "HelloWorld"; //前端WebService需调用函数 args[2] = "abc$text"; // 前端所需要的参数 object result = WSHelper.InvokeWebService(url, "AjaxWebService", args); string msg = result.ToString(); //显示页面 msgshow.InnerText = msg; } } }
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.cs" Inherits="WebApplication.index" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <script src="JS/jquery-1.8.2.min.js"></script> <title></title> <script type="text/javascript"> $(function(){ $.ajax({ url: "/AjaxHandler.ashx", data: { HostUrl: "http://localhost:2064/Handler1.ashx", action: "GetVs", name: "aa" }, type: "post", async:false, dataType: "text", success: function (data) { alert(data); } }); }); </script> </head> <body> <form id="form1" runat="server"> <div id="msgshow" runat="server"> </div> </form> </body> </html>
4、用到的类库WSHelper
using Microsoft.CSharp; using System; using System.CodeDom; using System.CodeDom.Compiler; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Web; using System.Web.Services.Description; namespace WebApplication.Models { public static class WSHelper { #region InvokeWebService /// < summary> /// 动态调用web服务 /// < /summary> /// < param name="url">WSDL服务地址< /param> /// < param name="methodname">方法名< /param> /// < param name="args">参数< /param> /// < returns>< /returns> public static object InvokeWebService(string url, string methodname, object[] args) { return WSHelper.InvokeWebService(url, null, methodname, args); } /// < summary> /// 动态调用web服务 /// < /summary> /// < param name="url">WSDL服务地址< /param> /// < param name="classname">类名< /param> /// < param name="methodname">方法名< /param> /// < param name="args">参数< /param> /// < returns>< /returns> public static object InvokeWebService(string url, string classname, string methodname, object[] args) { string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling"; if ((classname == null) || (classname == "")) { classname = WSHelper.GetWsClassName(url); } try { //获取WSDL WebClient wc = new WebClient(); Stream stream = wc.OpenRead(url + "?WSDL"); ServiceDescription sd = ServiceDescription.Read(stream); ServiceDescriptionImporter sdi = new ServiceDescriptionImporter(); sdi.AddServiceDescription(sd, "", ""); CodeNamespace cn = new CodeNamespace(@namespace); //生成客户端代理类代码 CodeCompileUnit ccu = new CodeCompileUnit(); ccu.Namespaces.Add(cn); sdi.Import(cn, ccu); CSharpCodeProvider icc = new CSharpCodeProvider(); //设定编译参数 CompilerParameters cplist = new CompilerParameters(); cplist.GenerateExecutable = false; cplist.GenerateInMemory = true; cplist.ReferencedAssemblies.Add("System.dll"); cplist.ReferencedAssemblies.Add("System.XML.dll"); cplist.ReferencedAssemblies.Add("System.Web.Services.dll"); cplist.ReferencedAssemblies.Add("System.Data.dll"); //编译代理类 CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu); if (true == cr.Errors.HasErrors) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors) { sb.Append(ce.ToString()); sb.Append(System.Environment.NewLine); } throw new Exception(sb.ToString()); } //生成代理实例,并调用方法 System.Reflection.Assembly assembly = cr.CompiledAssembly; Type t = assembly.GetType(@namespace + "." + classname, true, true); object obj = Activator.CreateInstance(t); System.Reflection.MethodInfo mi = t.GetMethod(methodname); return mi.Invoke(obj, args); /* PropertyInfo propertyInfo = type.GetProperty(propertyname); return propertyInfo.GetValue(obj, null); */ } catch (Exception ex) { throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace)); } } private static string GetWsClassName(string wsUrl) { string[] parts = wsUrl.Split('/'); string[] pps = parts[parts.Length - 1].Split('.'); return pps[0]; } #endregion } }
发表评论 / 取消回复