.NET 1.0中的Web服务技术,现在被认为是“遗留技术”。
我正在寻找一种好的、简洁的、结构化的方法来开始学习 x86 ASM。我有 Perl、Python 和 C/C++ 方面的经验,可以说我一直想“深入了解”一段时间......
将项目从 .Net 4.6.1 升级到 4.7.x 会导致 WCF Reference.cs 中出现错误
我有一个使用古老的 ASMX 服务的项目。在使用 .Net Framework 4.6.1 时,我可以添加对该服务的引用,并且没有遇到任何问题。但是一旦我将项目升级到 4.7 或 4.7.x,我
使用 ASP.NET Core 和 C# 将图像上传到本地 SQL 服务器时出错
我想将图像本身发送到本地主机上的 SQL Server(使用用 C# 编写的 ASP.NET Core Web 服务将图像从我的计算机发送到本地主机)。 我在客户端尝试过这个: 打开文件对话框...
使用 asp.net core C# 将图像上传到本地 SQL 服务器时出错
H 想要将图像本身发送到本地主机 SQL 服务器(使用 ASP 核心 C# Web 服务将图像从我的计算机发送到本地主机)。我在客户端尝试过这个: OpenFileDialog opf = 新 OpenFileDi...
我正在通过ajax Web方法从.asmx.cs文件调用函数。现在,我在 ajax 成功中得到了输出未定义的值。 这是我的代码, 我通过 ajax Web 方法从 .asmx.cs 文件调用函数。现在,我在 ajax 成功中获得输出 undefined 值。 这是我的代码, <input type="button" id="btnGetStock" value="View" class="button-89" /> $("#btnGetStock").click(function (e) { var dataToSend = { labelno: document.getElementById("<%=txt_labelno.ClientID%>").value }; $.ajax({ type: "POST", url: "FillGridMethod.asmx/QuotationList", data: dataToSend, dataType: "json", success: function (data) { alert(JSON.stringify(data.ItemType)); $("#lbl_type").val(data.ItemType); } }); }); 这是 .asmx 文件 [WebMethod(enableSession: true)] public void QuotationList(string labelno) { if (HttpContext.Current.Session["BranchId"].ToString() == null) { Server.Transfer("Index.aspx"); return; } var quotation = new List<QuotationModel>(); string constr = cn.ConnectionString; using (SqlConnection con = new SqlConnection(constr)) { qryFillGrid = " select ItemType from tbl_StockRunning stock " + System.Environment.NewLine; var cmd = new SqlCommand(qryFillGrid, con); con.Open(); var dr = cmd.ExecuteReader(); while (dr.Read()) { var quotationModel = new QuotationModel { ItemType = dr[0].ToString().Trim() }; quotation.Add(quotationModel); } } var js = new JavaScriptSerializer(); Context.Response.Write(js.Serialize(quotation)); } 现在,当我进行 alert(JSON.stringify(data)); 警报时,我会获得正确的值,比如 [{"ItemType":"GOLD"}] 格式。但是当我做 alert(JSON.stringify(data.ItemType)); 时,它变得 undefined 对象的序列化是自动的,并且开箱即用,该 Web 方法支持 SOAP、jQuery POST (AJAX),甚至 REST 调用也应该可以工作。 首先,发送的参数必须与函数签名匹配。 所以,假设我有这个: First Name: <asp:TextBox ID="txtFirst" runat="server" ClientIDMode="Static"> </asp:TextBox> <br /> Last Name: <asp:TextBox ID="txtLast" runat="server" ClientIDMode="Static"> </asp:TextBox> <br /> <asp:Button ID="cmdWebTest" runat="server" Text="Combine aobve" CssClass="btn" OnClientClick="mycombine();return false;" /> <br /> Result: <br /> <asp:TextBox ID="txtFullName" runat="server" ClientIDMode="Static"> </asp:TextBox> <script> function mycombine() { var tFirst = $('#txtFirst').val() var tLast = $('#txtLast').val() $.ajax({ type: "POST", contentType: 'application/json; charset=utf-8', url: '/WebService1.asmx/Combine', data: JSON.stringify({ FirstName: tFirst, LastName: tLast }), dataType: 'json', success: function (mydatastuff) { 4 $('#txtFullName').val(mydatastuff.d) }, error: function (data, success, error) { alert("Error: " + error + " - " + data + " - " + success + " - " + data.value) } }) } </script> 网页方法是这样的: [WebMethod()] public string Combine(string FirstName, string LastName) { string sResult = FirstName + " " + LastName; return sResult; } 注意返回数据如何嵌套在返回值的 .d 中。 (一直不喜欢这个怪癖,但这是出于安全原因)。 所以,上面的结果是这样的: 那么,要返回某个类对象的“列表”吗? 说一下这个方法: [WebMethod()] public List<OneHotel> GetHotels(string City) { DataTable rstData = new DataTable(); string strSQL = @"SELECT * FROM tblHotelsA WHERE City = @City AND Active = 1 ORDER BY HotelName"; using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4)) { using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn)) { conn.Open(); cmdSQL.Parameters.Add("@City",SqlDbType.NVarChar).Value = City; rstData.Load(cmdSQL.ExecuteReader()); } } List<OneHotel> sResult = new List<OneHotel>(); foreach (DataRow dr in rstData.Rows) { OneHotel hotel = new OneHotel(); hotel.HotelName = dr["HotelName"].ToString(); hotel.City= dr["City"].ToString(); hotel.Description= dr["Description"].ToString(); sResult.Add(hotel); } return sResult; } 因此,请注意我们如何返回类对象的列表。 所以,现在客户端变成了这样: <h3>Show hotels for what City</h3> <asp:TextBox ID="txtCity" runat="server" ClientIDMode="Static"> </asp:TextBox> <asp:Button ID="cmdGetHotels" runat="server" Text="Get Hotels" OnClientClick="showhotels();return false;" /> <script> function showhotels() { var tCity = $('#txtCity').val() $.ajax({ type: "POST", contentType: 'application/json; charset=utf-8', url: '/WebService1.asmx/GetHotels', data: JSON.stringify({ City : tCity}), dataType: 'json', success: function (mydatastuff) { var mytable = $('#myhotels') $.each(mydatastuff.d, function (index, obj) { var newRow = $("<tr>").appendTo(mytable) $("<td>").text(obj.HotelName).appendTo(newRow) $("<td>").text(obj.City).appendTo(newRow) $("<td>").text(obj.Description).appendTo(newRow) }) } , error: function (data, success, error) { alert("Error: " + error + " - " + data + " - " + success + " - " + data.value) } }) } </script> <br /> <br /> <br /> <table id="myhotels" class="table table-bordered table-hover" style="width:30%"> <tr> <th>Hotel Name</th> <th>City</th> <th>Description</th> </tr> </table> 现在的结果是这样的:
“字符串未被识别为有效的日期时间。”在 asp.net c# 的 asmx.cs 文件中
我有两种输入类型=“日期”和一种输入类型=“按钮” 我有两个输入类型=“日期”和一个输入类型=“按钮” <input type="date" runat="server" id="dtp_from" /> <input type="date" runat="server" id="dtp_to" /> <input type="button" id="btnSubmit" CssClass="custom-btn" value="Submit" /> 一个 GridView 表 <table id="gv_Datatable" class="table table-responsive table-hover"> <thead> <tr> <th>Id</th> <th>Date</th> <th>Name</th> <th>Description</th> <th>Receipt</th> <th>Payment</th> <th>Balance</th> <th>Actions</th> </tr> </thead> <tfoot> <tr> <th>Id</th> <th>Date</th> <th>Name</th> <th>Description</th> <th>Receipt</th> <th>Payment</th> <th>Balance</th> </tr> </tfoot> </table> 现在,当单击按钮时,ajax 方法被调用,并通过参数两个日期传递到 asmx.cs 文件。 $("#btnSubmit").click(function (e) { var dataToSend = { param1: JSON.stringify(document.getElementById("<%=dtp_from.ClientID%>").value), param2: JSON.stringify(document.getElementById("<%=dtp_to.ClientID%>").value) }; $.ajax({ type: "POST", url: "FillGridMethod.asmx/CashBookList", data: dataToSend, dataType: "json", success: function (data) { var datatableVariable = $('#gv_Datatable').DataTable({ dom: 'Bfrtip', data: data, columns: [ { 'data': 'Id', visible: false }, { 'data': 'cashbookdate', 'render': function (date) { var date = new Date(parseInt(date.substr(6))); var month = date.getMonth() + 1; return date.getDate() + "/" + month + "/" + date.getFullYear(); } }, { 'data': 'cashbookaccname' }, { 'data': 'cashbookdescription' }, { 'data': 'cashbookreceipt' }, { 'data': 'cashbookpayment' }, { 'data': 'Balance' }, { "render": function (data, type, row) { return "<a href='#' class='btn btn-success' onclick=DeleteCustomer('" + row.Id + "');>View</>"; } }, { "render": function (data, row) { return "<a href='#' class='btn btn-danger'>Delete</a>"; } }] }); } }); }); 这是asmx.cs文件代码 [WebMethod(enableSession: true)] public void CashBookList(string param1, string param2) { DateTime fromDate = DateTime.ParseExact(param1, "dd/MM/yyyy", CultureInfo.InvariantCulture); var cashBook = new List<CashBookModel>(); string constr = cn.ConnectionString; using (SqlConnection con = new SqlConnection(constr)) { qryFillGrid = " select cashbookid, cashbookdate, cashbookaccname, cashbookdescription, cashbookreceipt, cashbookpayment, Balance from tbl_cashbook " + System.Environment.NewLine; qryFillGrid += " where BranchID = " + HttpContext.Current.Session["BranchID"] + " " + System.Environment.NewLine; if (HttpContext.Current.Session["AccountMode"].ToString() != "ALL") { qryFillGrid += " and AccountMode = '" + HttpContext.Current.Session["AccountMode"].ToString() + "' " + System.Environment.NewLine; } if(param1 != "\"\"") { qryFillGrid += " and convert(varchar(10), convert(datetime, cashbookdate,105),112) >= '" + Convert.ToDateTime(service.IfNullThen(fromDate, DateTime.Now.Date)).Date.ToString("yyyyMMdd") + "' " + System.Environment.NewLine; if (param2 != "\"\"") { qryFillGrid += " and convert(varchar(10), convert(datetime, cashbookdate,105),112) <= '" + Convert.ToDateTime(service.IfNullThen(param2, DateTime.Now.Date)).Date.ToString("yyyyMMdd") + "' " + System.Environment.NewLine; } } else { qryFillGrid += " and convert(varchar(10), convert(datetime, cashbookdate,105),112) = '" + System.DateTime.Now.Date + "' " + System.Environment.NewLine; } qryFillGrid += " order by cashbookdate, cashbookid desc " + System.Environment.NewLine; var cmd = new SqlCommand(qryFillGrid, con); con.Open(); var dr = cmd.ExecuteReader(); while (dr.Read()) { var cashBookModel = new CashBookModel { Id = Convert.ToInt32(dr[0]), cashbookdate = Convert.ToDateTime(dr[1]), cashbookaccname = dr[2].ToString(), cashbookdescription = dr[3].ToString(), cashbookreceipt = Convert.ToDecimal(service.IfNullThen(dr[4], 0)), cashbookpayment = Convert.ToDecimal(service.IfNullThen(dr[5], 0)), Balance = Convert.ToDecimal(service.IfNullThen(dr[6], 0)), }; cashBook.Add(cashBookModel); } } var js = new JavaScriptSerializer(); Context.Response.Write(js.Serialize(cashBook)); } DateTime fromDate = DateTime.ParseExact(param1, "dd/MM/yyyy", CultureInfo.InvariantCulture); 在 asmx.as 文件的下面一行中出现错误,即: '字符串未被识别为有效的日期时间。' @s.k.索尼 应该可以。检查此代码。
我有一个带有aspx页面的WEB应用程序(没有数据库,非常简单的Web应用程序)。但现在我需要添加一些API服务。我会像在 MVC 中编程一样添加控制器,但这可能吗?我...
如何使用 Visual Studio 2022 .NET 6 中的旧版 SOAP Web 服务
当尝试使用 .NET 6 Framework 项目在 Visual Studio 2022 中对旧版 2.0 Web 引用 ASMX 进行服务引用时,我执行以下步骤: -“添加服务参考”...
我们有一些旧的 ASMX Web 服务,它们已移至额外的安全层后面。 WSDL 是自动生成的运行时,现在使用它运行的服务器的 IP,而不是 pub...
我的 wsdl 在地址位置放置了错误的域,如何修复? - - 我的 wsdl 在地址位置放置了错误的域,如何修复它? - <wsdl:service name="XWebService"> - <wsdl:port name="XServiceSoap" binding="tns:XWebServiceSoap"> <soap:address location="https://machine.wrongdomain.com.br/webservices/MapleStoryWebService.asmx" /> </wsdl:port> - <wsdl:port name="XWebServiceSoap12" binding="tns:XWebServiceSoap12"> <soap12:address location="https://machine.wrongdomain.com.br/webservices/XWebService.asmx" /> </wsdl:port> - <wsdl:port name="XWebServiceHttpGet" binding="tns:XWebServiceHttpGet"> <http:address location="https://machine.wrongdomain.com.br/webservices/MapleStoryWebService.asmx" /> </wsdl:port> - <wsdl:port name="XWebServiceHttpPost" binding="tns:XWebServiceHttpPost"> <http:address location="https://machine.wrongdomain.com.br/webservices/XWebService.asmx" /> </wsdl:port> </wsdl:service> 真正的域名就像https://machine.goodDomain.com.br 该地址取自用于访问 WSDL 的 URL。如果它与您想要实际提供服务的服务器不同,那么您可以通过创建一个扩展 SoapExtensionReflector 的类来更改它。以下是有关如何更改 URL 的示例文章: http://blogs.msdn.com/kaevans/archive/2005/11/16/493496.aspx 另一种选择是使用 IIS URL 重写模块 (http://www.iis.net/downloads/microsoft/url-rewrite) 首先 - 捕获 XWebService.asmx?WSDL 的输出并将其保存为 HTML 文件(例如 wsdl.htm)。 编辑此文件并将位置更改为备用地址 ...来自 thishost.domain.com: - <wsdl:port name="XWebServiceHttpPost" binding="tns:XWebServiceHttpPost"> <http:address location="http://thishost.domain.com/XWebService.asmx" /> </wsdl:port> ...至 thathost.domain.com: - <wsdl:port name="XWebServiceHttpPost" binding="tns:XWebServiceHttpPost"> <http:address location="http://thathost.domain.com/XWebService.asmx" /> </wsdl:port> 在 IIS 中 - 在网站/虚拟功能视图中找到 URL 重写图标。然后单击 添加规则 并选择 入站规则 - 空白规则。 使用规则 - 适当命名并设置将接收 WSDL 请求的 Web 服务 URL 的模式匹配。对于正则表达式: (.*)XWebservice.asmx 对于条件,将 {QUERY_STRING} 与 WSDL 以及 {REQUEST_METHOD} 与 GET 匹配。 对于Action - 将其设置为Rewrite(因此这对客户端来说是透明的)并选择我们之前保存的文件(wsdl.htm)。 这还会向 web.config 的 system.webServer 部分添加一个新的 rewrite 部分 <system.webServer> <rewrite> <rules> <rule name="WSDL Rewrite" stopProcessing="true"> <match url="(.*)XWebService.asmx" /> <conditions> <add input="{QUERY_STRING}" pattern="WSDL" /> <add input="{REQUEST_METHOD}" pattern="GET" /> </conditions> <action type="Rewrite" url="wsdl.htm" /> </rule> </rules> </rewrite> </system.webServer> 为什么不手动将 WSDL 文件中的地址编辑为应有的地址呢? 如果 WSDL 是由其他工具生成的,请告诉我们它是如何生成的,也许我们可以提供帮助。否则,没有法律禁止修改生成的文件以满足您的需要。如果原始用户环境的 WSDL 的问题只是 URL 错误,那么直接修改 URL 是完全合法的。 最初的反应是正确的。 WSDL 中的默认 URL 取决于用于访问 WSDL 的 URL。 我的团队过去处理更改服务 URL 的方式(例如,从开发环境过渡到测试或生产环境)是使用 wsdl.exe 为您的 Web 服务生成代码代理(代理实际上是通过以下方式创建的)也可以是 Web 或服务引用,但默认情况下不会显示在 Visual Studio 中),您可以编辑生成的代理类以从 (??) 任何您想要存储它的位置(数据库、配置文件等)读取服务的 URL。 解决方案很少,我会按照从简单到准确的顺序进行排序。 :) 不用担心 WSDL 中的 URL。 只需在客户端使用 Url 属性,就像在这种情况下: public class MyWebService : RemoteService { public MyWebService() : base() { Url = ConfigurationManager.AppSettings["MyServiceCustomUrl"]; } } 明显的缺点:很可能您将无法使用生成的 html(我的意思是为 Web 方法生成的表单)正确测试服务。 使用自定义wsdlHelpGenerator。 我没有测试这个解决方案,但乍一看,如果您基于原始的 DefaultWsdlHelpGenerator.aspx 创建自己的解决方案,它看起来很简单(您可以在 C:\Windows\Microsoft.NET\Framework* 文件夹中找到它) ,就我而言,它是 C:\Windows\Microsoft.NET\Framework 4.0.30319\Config\DefaultWsdlHelpGenerator.aspx)。 使用soapExtensionReflectorTypes。它将允许您使用 HttpSoap 协议地址执行任何操作。 创建一个处理程序(下面的示例将 http 更改为 https): public class HttpsReflector : SoapExtensionReflector { public override void ReflectMethod() { // nothing to override } public override void ReflectDescription() { ServiceDescription description = ReflectionContext.ServiceDescription; foreach (System.Web.Services.Description.Service service in description.Services) { foreach (Port port in service.Ports) { foreach (ServiceDescriptionFormatExtension extension in port.Extensions) { if (extension is SoapAddressBinding binding) { binding.Location = binding.Location.Replace("http://", "https://"); } } } } } } 在 web.config 中注册: <system.web> <webServices> <soapExtensionReflectorTypes> <!-- Required to replace http in addresses for HttpSoap protocol --> <add type="MyWebServices.WsdlFixHttp.HttpsReflector, MyWebServices"/> </soapExtensionReflectorTypes> </webServices> </system.web> 缺点:无法控制 HttpPost/HttpGet 协议。 实现IIS重写模块。它将允许您修改服务产生的任何输出。可以与#3一起使用。 创建2个类,流装饰器: public class StreamWatcher : Stream { private readonly Stream _base; private readonly MemoryStream _memoryStream = new MemoryStream(); public StreamWatcher(Stream stream) { _base = stream; } public override void Flush() { _base.Flush(); } public override int Read(byte[] buffer, int offset, int count) { return _base.Read(buffer, offset, count); } public override void Write(byte[] buffer, int offset, int count) { _memoryStream.Write(buffer, offset, count); _base.Write(buffer, offset, count); } public override string ToString() { return Encoding.UTF8.GetString(_memoryStream.ToArray()); } public override bool CanRead => _base.CanRead; public override bool CanSeek => _base.CanSeek; public override bool CanWrite => _base.CanWrite; public override long Seek(long offset, SeekOrigin origin) => _base.Seek(offset, origin); public override void SetLength(long value) => _base.SetLength(value); public override long Length => _base.Length; public override long Position { get => _base.Position; set => _base.Position = value; } } 和模块: public class WsdlFixHttpModule : IHttpModule { public void Init(HttpApplication context) { context.EndRequest += (s, e) => OnEndRequest(s, e); context.BeginRequest += (s, e) => OnBeginRequest(s, e); } private void OnBeginRequest(object sender, EventArgs e) { HttpContext httpContext = HttpContext.Current; if (httpContext.Request.Url.Query.Equals("?WSDL", StringComparison.InvariantCultureIgnoreCase) || IsAsmxGetRequest(httpContext)) { httpContext.Response.Filter = new StreamWatcher(httpContext.Response.Filter); } } private void OnEndRequest(object sender, EventArgs e) { HttpContext httpContext = HttpContext.Current; string oldValue = "", newValue = ""; bool replacementRequired = false; if (httpContext.Request.Url.Query.Equals("?WSDL", StringComparison.InvariantCultureIgnoreCase)) { oldValue = ":address location=\"http://"; newValue = ":address location=\"https://"; replacementRequired = true; } else if (IsAsmxGetRequest(httpContext)) { oldValue = "<form target=\"_blank\" action='http://"; newValue = "<form target=\"_blank\" action='https://"; replacementRequired = true; } if (replacementRequired) { string wsdl = httpContext.Response.Filter.ToString(); wsdl = wsdl.Replace(oldValue, newValue); httpContext.Response.Clear(); httpContext.Response.Write(wsdl); httpContext.Response.End(); } } private static bool IsAsmxGetRequest(HttpContext httpContext) { return httpContext.Response.ContentType == "text/html" && httpContext.Request.CurrentExecutionFilePathExtension.Equals(".asmx", StringComparison.InvariantCultureIgnoreCase) && httpContext.Request.HttpMethod == "GET"; } public void Dispose() { } } 然后在web.config中注册模块: <system.webServer xdt:Transform="Insert"> <modules> <!-- Required to replace http in addresses for HttpPost/HttpGet protocols --> <add name="WsdlFixHttpModule" type="MyWebServices.WsdlFixHttp.WsdlFixHttpModule, MyWebServices"/> </modules> </system.webServer> 请注意,上面的注册是集成模式,经典模式需要在里面注册system.web。 因此,在我们的遗留项目中,我使用了 3+4 方法,但如果我想再次这样做,我会尝试使用#2 方法。 :)
如何使桌面项目自动生成的 WSDL 类似于 Web 服务生成的另一个 WSDL?
这是我在这里潜伏多年以来第一次作为海报。我还将借此机会感谢所有社区多年来一直以来的帮助。谢谢你! 这也是我的...
我有一项旧版 ASMX 服务,可供许多客户端(java、.Net、Python 等)使用。我想将 ASMX 服务升级到 WCF,而不影响我的客户(意味着他们不会做任何更改...
ASMX 可以有像 WCF 一样的 IOC 吗? 基本上我希望能够将我的依赖项注入到 ASMX Web 服务中。这可能吗?如果可能的话,如何实现。 WCF 方式(这样的事情就太棒了) http:...
我们所有的应用程序都已转换为使用 StructureMap,我们的库也已转换。 我正在尝试转换我们的一项 ASP.NET Web 服务。 如果我理解正确,我将不得不引导......
无法在 Visual Studio 2022 中找到 ASP.NET Web 服务
用于在 Visual Studio 2022 中创建简单的 Web 服务。 在 Visual Studio 2022 中,创建 ASP.NET Web 应用程序 (.NET Framework),然后选择空模板并输入名称并创建项目...
客户端向我提供了 wsdl 来生成 Web 服务。但是当我使用 wsdl.exe 命令时,它生成了 .cs 类。我在我的网络服务中使用了该课程,当我提供 ws 时...
我有一个简单的网络服务(asmx)。我说简单是因为在故障排除过程中,我实际上删除了除“Return”语句之外的每一行代码。该服务无需执行任何操作...
我正在 IIS 7 上运行 ASMX Web 服务。客户端是 silverlight 应用程序。我向 Web 服务发出几个异步文件请求,并在 AsyncCompleted 上处理它们。有时...
更改 Visual Studio 2012-2015 中的输出类型。
我曾经使用Visual Studio 2008和2010。我需要将Web服务项目的输出类型更改为类库。为了得到asmx的.dll。 当我使用VS2008时,我这样做: 右C...
我有一个包含 ASMX Web 服务的项目和一个使用客户端代理连接到它的桌面客户端(使用来自 ASM Web 服务的 WSDL)。 使用 svc 实用程序升级代理以生成 WCF 服务...