为什么asmx文件必须有一个只有int作为参数的webservice
本文关键字:int 参数 webservice 文件 asmx 有一个 为什么 | 更新日期: 2023-09-27 17:57:42
我有一个asmx web服务,它需要一个字符串和两个int来返回数据。当我直接运行asmx页面并调用它时,我得到一个500错误,在chrome上得到以下内容:
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at System.Web.Services.Protocols.HttpServerType..ctor(Type type)
at System.Web.Services.Protocols.HttpServerProtocol.Initialize()
at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing)
但是,当我将以下web服务与实际的web服务一起添加到asmx.cs文件中时,它就可以工作了。
[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public string getBlah(int blah)
{
return "blah";
}
然后我去了我工作过的几个旧网站,所有这些网站都至少有一个只有int作为输入的web服务,当我删除了只包含int的web服务时,其余的都失败了。那么,为什么asmx web服务需要一个只有int作为参数的web服务才能让其他web服务工作呢?
这发生在.Net 4上。尚未测试任何其他版本。
编辑:
我能够创建一个损坏的模型,但即使添加int似乎也无法修复这个模型。我创建了一个新的webforms.net4项目,并添加了以下asmx文件。注释掉AMethod会导致所有者中断,而不是什么都不返回。我将值a、1、1用于Owner Web Service的三个字段。
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Script.Serialization;
using System.Web.Script.Services;
using System.Web.Services;
namespace WebApplication2
{
/// <summary>
/// Summary description for WebService1
/// </summary>
[WebService(Namespace = "http://www.mysite.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{
[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public string AMethod(int page)
{
return "blah";
}
[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public void Owners(string searchTerm, int pageSize, int page)
{
string retJson = "";
Context.Response.Write(retJson);
}
[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public string Results(List<string> counties, List<string> field2, List<string> field3, string owners, int pageSize, int page)
{
return "['"test'":'"hi'",'"test2'":'"bye'"]";
}
}
}
500是内部服务器错误,它表示ur逻辑错误。这将帮助您了解如何使用WebService.asmx.
.aspx面
通过脚本获取输入。
function InsertDetail() {
var prhid = $("#<%=PRHId.ClientID%>").val();
var item = $("#<%=TextBox1.ClientID%>").val();
var Quantity = $("#<%=TextBox2.ClientID%>").val();
var Price = $("#<%=TextBox3.ClientID%>").val();
var Make = $("#<%=TextBox4.ClientID%>").val();
var Discription = $("#<%=TextBox5.ClientID%>").val();
var d = [];
d.push(prhid);
d.push(item);
d.push(Quantity);
d.push(Price);
d.push(Make);
d.push(Discription);
var jsnDta = JSON.stringify({ d: d });
alert(jsnDta);
$.ajax({
type: "POST",
url: "InsertRequestDetail.asmx/InsertDetail",
data: jsnDta,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (r) {
var rtnData = r.d; //all returned data...
var respDta = [];
$.map(rtnData, function (item, index) {
var j = [
item.status,
item.msg,
];
respDta.push(j);
});
$.each(respDta, function (key, value) {
var status = value[0];
var msg = value[1];
if (status == true) {
alert(msg);
} else {
alert("Error" + msg);
}
});
.asmx侧
现在我们所需要做的就是调用获取的输入的值并将其保存在Db表中。
public class InsertRequestDetail : System.Web.Services.WebService
{
[ScriptMethod(UseHttpGet = true)]
[WebMethod]
public List<RequestResponse> InsertDetail(List<string> d)
{
List<RequestResponse> list = new List<RequestResponse>();
string prhid = d[0];
string item = d[1];
string Quantity = d[2];
string Price = d[3];
string Make = d[4];
string Discription = d[5];
Pro_DbCon obj2 = new Pro_DbCon();
string constr = obj2.dbconnection();
SqlConnection con = new SqlConnection(constr);
try
{
con.Open();
string select = "Select * From Pro_Detail where PRHId = @prhid AND Item = @item AND Quantity = @quantity AND Price = @price AND Make = @make AND Discription = @dis";
SqlCommand cmd1 = new SqlCommand(select, con);
cmd1.Parameters.AddWithValue("@prhid", prhid);
cmd1.Parameters.AddWithValue("@item", item);
cmd1.Parameters.AddWithValue("@quantity", Quantity);
cmd1.Parameters.AddWithValue("@price", Price);
cmd1.Parameters.AddWithValue("@make", Make);
cmd1.Parameters.AddWithValue("@dis", Discription);
SqlDataReader dr = cmd1.ExecuteReader();
if (dr.Read())
{
dr.Close();
RequestResponse r = new RequestResponse();
r.status = false;
r.msg = "Duplicate";
list.Add(r);
}
else
{
dr.Close();
string insertquery = "Insert into Pro_Detail (PRHId,Item,Quantity,Price,Make,Discription ) values (@prhid,@item,@quantity,@price,@make,@dis)";
SqlCommand cmd = new SqlCommand(insertquery, con);
cmd1.Parameters.AddWithValue("@prhid", prhid);
cmd1.Parameters.AddWithValue("@item", item);
cmd1.Parameters.AddWithValue("@quantity", Quantity);
cmd1.Parameters.AddWithValue("@price", Price);
cmd1.Parameters.AddWithValue("@make", Make);
cmd1.Parameters.AddWithValue("@dis", Discription);
int affectedrows = cmd.ExecuteNonQuery();
if (affectedrows > 0)
{
RequestResponse r = new RequestResponse();
r.status = true;
r.msg = "success";
list.Add(r);
}
else
{
RequestResponse r = new RequestResponse();
r.status = false;
r.msg = "error on adding";
list.Add(r);
}
}
}
catch (Exception ex)
{
RequestResponse r = new RequestResponse();
r.status = false;
r.msg = "Error !" + ex.ToString();
list.Add(r);
}
finally
{
con.Close();
}
return list;
}
}
如果你得到500内部服务器错误相关。asmx是查找逻辑错误或打字错误的地方。