为什么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'"]";
        }
    }
}

为什么asmx文件必须有一个只有int作为参数的webservice

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是查找逻辑错误或打字错误的地方。