为什么asmx文件必须只有一个int作为参数的web服务?

时间:2014-04-09 19:29:44

标签: c# asp.net web-services .net-4.0 asmx

我有一个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也似乎没有解决这个问题。我创建了一个新的Web表单.net 4项目并添加了以下asmx文件。评论AMethod导致所有者破坏而不是什么也不返回。我在Owner webservice的三个字段中使用值a,1,1。

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\"]";
        }
    }
}

1 个答案:

答案 0 :(得分:0)

500是内部服务器错误,它表示您的逻辑错误。 这将有助于您了解如何使用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 side

现在我们需要做的就是调用已获取输入的值并将其保存在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是寻找逻辑错误或错误输入的地方。