我希望有人可以帮我弄清楚我写过的.net核心web-api应用程序是怎么回事 - 我花了一整天的时间尝试调试它,这让我发疯了。
服务器应用程序使用VS 2017 RC下的asp.net core 1.1以c#编写。我有一个控制器接受一个将返回一个简单对象的帖子。作为参考,基本控制器类如下所示:
[HttpPost]
public IActionResult Create([FromBody] websiteOrder myOrder)
{
return StatusCode(201, new ObjectResult( OrderRepos.Add(myOrder)));
}
我在客户端使用JQuery ajax()调用,如下所示:
$.ajax({
url: myURL+"prices",
type: 'POST',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
data:JSON.stringify(myCart),
async: true,
success: function (data) {
...
},
error: function (textStatus, errorThrown) {
...
}
这项工作大部分时间都很精细。但是我注意到某些命令导致ajax()调用错误并导致400 Bad Response。在最终追踪它时,它归结为MyCart数据中是否存在'£'(英镑)符号。如果£存在则会出错。如果我将£换成$符号,那么它可以正常工作。
数据的好坏版本的'stringified'JSON如下:
这有效:
[{\“sku \”:\“WA01GMT \”,\“num \”:1,\“price \”:\“$ 180.00 \”,\“desc \”:\“观看01 - Gunmetal with tan strap \“,\”cCode \“:\”GB \“}]”
这不起作用:
[{\“sku \”:\“WA01GMT \”,\“num \”:1,\“price \”:\“£180.00 \”,\“desc \”:\“观看01 - 青铜色用棕褐色表带\“,\”cCode \“:\”GB \“}]”
我能看到的唯一区别是英镑字符。我的印象是默认情况下所有ajax()调用都是utf-8。我在编码或语言环境中遗漏了一些明显的东西吗?我已经考虑过(简要地)encodeURIComponent()等,但这是POST而不是GET,我的理解是默认情况下应该正确编码?
BTW当发生错误时,在服务器端没有触发任何东西,因为我在控制器上有一个断点。服务器和客户端都使用IIS在同一本地计算机上运行。
非常感谢任何想法/指导。
重要编辑:
我已经对此做了一些进一步的测试。我假设问题出在ajax()调用和编码,而不是服务器端。但是我可能误导了你 - 道歉。
在服务器端,有一个数据库记录正在通过DbContext查找。此数据库最初提供进程中较早进入myCart对象的数据,然后在此特定ajax()POST返回服务器时再次访问。带有£符号的字段不是控制器中的索引或{id}字段,而是POST中包含的纯辅助数据。
奇怪的是,如果£字符在数据库中,那么调用错误,即使我在提交ajax POST之前在客户端手动编辑它:
myCart[0].price = "$180";
基本上,总的来说,我现在遇到这样一种情况:当POST发生时,JSON字符串在两种情况下(存在$符号)是相同的,但在一种情况下它是错误而另一种情况则不是。不同之处在于,控制器在服务器上访问的服务器SQL数据库记录中存在£符号。正如我前面提到的那样 - 控制器或界面中的代码似乎都没有出现错误发生在某个地方(这可能是什么建议?)
[Produces("application/json")]
[Route("api/Prices")]
public class PricesController : Controller
{
public IPrice PriceRepo { get; set; }
public PricesController(IPrice _repo)
{
PriceRepo = _repo;
}
[HttpPost]
public IActionResult Create([FromBody] IEnumerable<ProductOrder> myCart)
{
return StatusCode(201, new ObjectResult(PriceRepo.GetTotals(myCart)));
}
[HttpGet("{id}", Name = "GetPrice")]
public IActionResult GetById(string id, string cCode)
{
var item = PriceRepo.Find(id,cCode);
if (item == null)
{
return NotFound();
}
return new ObjectResult(item);
}
}
很抱歉让你搞砸了 - 我会将我的调查转移到服务器数据库并对其进行编码,看看我是否能找到问题所以请不要担心ajax调用中没有工作的东西 - 这不会似乎是这样。
我是.net核心的新手,对于MVC来说还是新手,所以在数据库中编码可能导致问题的相当基础。欢迎任何其他想法指出我正确的方向: - )
最终编辑 - 然后我放弃了: - (
这似乎是我机器上本地MSSQLLocal Express数据库的问题。当我将此发布到Azure并使用Azure SQL数据库时,问题就会消失 - 它只会在本地运行时发生。
我已经尝试将相关列的排序规则更改为Latin_100排序规则,但这似乎没有任何区别(无论如何在黑暗中刺伤一点)。
如果有人能向我解释为什么在我的本地数据库中的一个字段中坐在web-api控制器上的£符号在调用该特定记录的控制器时导致400错误我很想知道:-(并乐意推荐答案:-)。暂时我会做我最擅长的事情并解决它,因为它似乎在生产环境中正常工作: - )
感谢您的评论