【问题标题】:Calling Web API 2 service from ASP.net WebMethod codebehind从 ASP.net WebMethod 代码隐藏调用 Web API 2 服务
【发布时间】:2016-02-19 18:49:37
【问题描述】:

我正在尝试从背后的 ASP.net 代码调用我的 Web API Web 服务。

使用 WebMethod 函数:

[WebMethod]
public static string checkQuery(string sql)
{
    string encryptingIT = new AES().Encrypt(sql);
    string result = q(encryptingIT);
    return result;
}

public async Task<string> q(string encryptingIT)
{
    var client = new HttpClient();
    var content = new StringContent(JsonConvert.SerializeObject(new Product { query = encryptingIT, empImg = false }));
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    var response = await client.PostAsync("http://dev-zzzz/newWS/theQ", content);

    var value = await response.Content.ReadAsStringAsync();

    return value;
}

但是,我在线出错:

q(加密IT);

其中规定:

错误 16 非静态字段、方法或属性“WebApi.App._default.q(string)”需要对象引用

我尝试将 HttpClient 放入同一个 checkQuery 函数,但似乎不允许我在执行此操作时通过单击 asp 按钮调用该函数。

我主要通过 jQuery Ajax 使用 Web 服务,如下所示:

$.support.cors = true;

$.ajax({
    type: "POST",
    crossDomain: true,
    url: "http://dev-zzzz/newWS/theQ",
    beforeSend: function (xhrObj) {
       xhrObj.setRequestHeader("Content-Type", "application/json");
    },
    data: JSON.stringify({
       theID: "2135648792",
       empImg: "false"
    }),
    dataType: "json",
    success: function (msg) {

    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {

    }
});

而且效果很好。

我可以做些什么来在我的WebMethod 函数背后的代码模仿AJAX

【问题讨论】:

  • 错误很明显,你不能在没有引用类实例的情况下从静态调用实例函数,只需将第二个也设置为静态就可以了,如果您必须将该函数保留为实例,则将代码移动到静态函数并从实例调用它

标签: c# jquery asp.net asp.net-web-api asp.net-web-api2


【解决方案1】:

无法实例化静态类。因此,永远无法访问非静态成员。

如果你想混合和匹配静态成员,不要将类设为静态。

【讨论】:

    【解决方案2】:

    您的查询方法应该是静态的。

    [WebMethod]
    public static string checkQuery(string sql)
    {
        string encryptingIT = new AES().Encrypt(sql);
        string result = q(encryptingIT).Result;
        return result;
    }
    
    public static async Task<string> q(string encryptingIT)
    {
        var client = new HttpClient();
        var content = new StringContent(JsonConvert.SerializeObject(new Product { query = encryptingIT, empImg = false }));
        content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        var response = await client.PostAsync("http://dev-zzzz/newWS/theQ", content);
    
        var value = await response.Content.ReadAsStringAsync();
    
        return value;
    }
    

    【讨论】:

    • 当我这样做时,我在同一行得到错误 错误 17 无法将类型'System.Threading.Tasks.Task'隐式转换为'string'
    • 错误 16 'await' 运算符只能在异步方法中使用。考虑使用“async”修饰符标记此方法并将其返回类型更改为“Task”。 就像我说的那样,这样做会使 asp 按钮不会触发 webMethod。
    • 糟糕,抱歉。你应该得到Task.Result
    • 我们通常在WebMethods 中不使用任何异步代码,因为它必须在最后返回一个值。我建议在这里去掉异步的东西,因为它真的没有意义,因为你的 WebMethod 请求不会被异步处理。你可以使用RestSharp
    • 有例子吗,@Soham?
    【解决方案3】:

    最终使用了这个:

    [WebMethod]
    public static string checkQuery(string sql)
    {
        string encryptingIT = new AES().Encrypt(sql);
    
        var client = new RestClient("http://dev-zzzz/newWS");
        var request = new RestRequest("theQ/", Method.POST);
    
        request.RequestFormat = DataFormat.Json;
    
        request.AddBody(new Product
        {
            query = encryptingIT,
            empImg = false
        });
    
        IRestResponse response = client.Execute(request);
        var content = response.Content;
    
        return content;
    }
    

    谢谢,@Soham Dasgupta

    【讨论】:

      猜你喜欢
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多