【问题标题】:how to add webapi to aspx web page如何将 webapi 添加到 aspx 网页
【发布时间】:2017-09-03 16:37:09
【问题描述】:

我有一个显示页面 -Default.aspx 的网站,现在我在项目中添加了一个 webapi 控制器类。我怎样才能让它运行。即,如果我只是用我的 URL 创建一个 Post 请求,它是不工作。下面是我的 webapi 控制器类,如何将它集成到我当前的网站中 - 这样我就可以发布请求并获取返回字符串。

public class Valcontrol : ApiController
{
    // GET api/<controller>
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
    // GET api/<controller>/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/<controller>
    public String Post([FromBody]string value)
    {
       return "Test";              
    }

    // PUT api/<controller>/5
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/<controller>/5
    public void Delete(int id)
    {
    }
}

如果我向“www.xyz.in”发出 Post 请求,我会在我的返回流中获取整个网页,而不是我在上面的 Post 函数中返回的字符串“Test”。

我的应用程序中的客户端调用 - Java 代码:

    URL url = new URL("http://www.xyz.in/");
            // get the payuConfig first
            String postParam = "Dev";  
            byte[] postParamsByte = postParam.getBytes("UTF-8");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.setRequestProperty("Content-Length", String.valueOf(postParamsByte.length));
            conn.setDoOutput(true);
            conn.getOutputStream().write(postParamsByte);
            InputStream responseInputStream = conn.getInputStream();
            StringBuffer responseStringBuffer = new StringBuffer();
            byte[] byteContainer = new byte[1024];
            for (int i; (i = responseInputStream.read(byteContainer)) != -1; ) {
                responseStringBuffer.append(new String(byteContainer, 0, i));
            }
            String strResponse = responseStringBuffer.toString();

以下是当我将 webapi 类添加到我的项目时添加到我的 web.config(由 Visual Studio)文件中的内容。

 <system.webServer>
<handlers>
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit"/>
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit"/>
  <remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0"/>
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0"/>
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>
</handlers>

【问题讨论】:

  • 您的字符串返回到 ajax 请求的数据中...确保您在发布的帖子中包含该值,否则它可能无法正确映射
  • 一个基本疑问,确认是否做对了。在客户端应用程序中,我正在向我网站的默认 URL 发送 Post 请求,我应该使用 /api/Valcontrol 来执行 Post 事件吗?
  • 是的,您可能正确地发出了发布请求,只是您的控制器没有正确命名
  • 显示带有正文消息的客户端调用
  • @MarcusH 更新了上面的问题..

标签: c# asp.net asp.net-web-api asp.net-web-api-routing


【解决方案1】:

此 swill 无效 Valcontrol 不是控制器的有效名称。控制器需要有后缀控制器才能正确映射。

所以你需要把名字改成 ValController,或者 ValControlController。

[Route("api/[controller]")]
public class ValController : ApiController
{
    // GET api/<controller>
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
    // GET api/<controller>/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/<controller>
    public String Post([FromBody]string value)
    {
       return "Test";              
    }

    // PUT api/<controller>/5
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/<controller>/5
    public void Delete(int id)
    {
    }
}

然后像这样发出您的帖子请求:

POST  api/val?value=Test

并将标题更改为 Content-Type:application/json

【讨论】:

  • 更改您的内容类型以及尝试使用我上面提供的类
  • 1) 在我的客户端应用程序中我必须更改 - conn.setRequestProperty("Content-Type", "application/application/json"); - 完成。,2) 更新类名 -done.,3) 我注意到你已经添加了 [Route("api/[controller]")] - 如果我添加这个,Visual Studio 会显示错误。"类型或命名空间 Route 可以找不到。” 4) Dint 理解语句“POST api/val?value=Test” - 请解释一下..
  • @user1066231 这是路由语法适用于最新版本的 .NET 我不确定你在运行什么,但应该设置到你的控制器的 post 路由减去控制器前缀 IE ValuesController 会转到价值观。
  • @user1066231 最后一条语句是你的 post 请求应该是什么样子,你 post request 需要一个值 Value 确保它在发送 post 请求时分配
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
  • 2011-12-06
相关资源
最近更新 更多