gpt4 book ai didi

c# - 如何在 Web API 中上传 "text/plain"字符串

转载 作者:行者123 更新时间:2023-11-30 22:16:48 25 4
gpt4 key购买 nike

我拼命尝试在 Web API 中上传纯文本(文本/纯文本)字符串,而我的 Controller 只是拒绝正确执行路由。我得到的只是一个 404(未找到)HTTP 错误(我很高兴所有“Get”方法都开箱即用:-()

这是我的路线:

public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "IntegraApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "ServComAdminApi",
routeTemplate: "admin/{action}",
defaults: new { controller = "admin", action = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "ServComApi",
routeTemplate: "{id}/{action}",
constraints: new { id = @"\d+" },
defaults: new { controller = "servcom", action = "info" }
);

// Get rid of XML responses
var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
}
}

相关路由是最后一个映射到“servcom” Controller 的路由。我正在移植遵循该路由模式(“id/action”)的自定义编写的 HTTP 服务器。它适用于所有“获取”方法。我可以通过以下方式获取 ID 为“10”的设备的“用户”列表:http://localhost:49410/10/users...但是当我尝试时它不起作用上传“字符串数据”。这是我 Controller 上的相关方法:

public class ServcomController : ApiController
{
[HttpPut, HttpPost]
public string Vis(long idTerm)
{
return "PUT/POST Vis for: " + idTerm;
}
}

它被精简到最低限度。我什至没有阅读实际的字符串数据。因为我不会发送表单编码数据,只是一个普通字符串(这个 API 目前在 3G 下使用,所以任何字节节省都很好,因为我们需要尽量减少数据计划的使用),我没有使用 [FromBody] 属性作为它根本不起作用。

这是用来测试它的客户端代码:

using System;
using System.Net;

namespace TestPutPostString
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Sending 'HELLO WORLD!'");
var wc = new WebClient();
var res = wc.UploadString("http://localhost:49410/101/vis", "PUT", "HELLO WORLD!");
Console.WriteLine("Response: " + res);
Console.ReadKey(true);
}
}
}

失败并显示:“远程服务器返回错误:(404) 未找到。”

上面的代码与我手写的 HTTP 服务器完美配合,它使用 TcpServer 并且是为了这个 API 的特定需求从头开始编写的(我在使用 2 年后将它迁移到 Web.API,因为它将是以这种方式更容易将其托管在 Azure 上)。使用带有手写 HTTP 堆栈的相同示例程序,消息正文在到达服务器时确实具有“HELLO WORLD!”。为什么它不被路由到 ServComController.Vis() 方法?

我发错了吗? WebClient.UploadString() 是否以其他不可预测的方式工作?还是我的 Controller 方法签名错误?路线错了吗?我错过了什么!?!? :-)

最佳答案

如果您想避免操作选择的痛苦,您可以将签名更改为,

public class ServcomController : ApiController
{
[HttpPut, HttpPost]
public HttpResponseMessage Vis(HttpRequestMessage request)
{
var idTerm = request.GetRouteData().Values["idTerm"];
var body = request.Content.ReadAsStringAsync().Result;
return "PUT/POST Vis for: " + idTerm;
}
}

关于c# - 如何在 Web API 中上传 "text/plain"字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17128852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com