【问题标题】:How can I test my web api Post Web method to know what's going on inside?如何测试我的 web api Post Web 方法以了解里面发生了什么?
【发布时间】:2016-07-10 00:07:23
【问题描述】:

所以这是我的情况......

我们有一个 Microsoft Dynamics CRM 的本地安装,我正在尝试从它对我在另一台服务器上创建的服务进行 ajax 调用。我已经解决了许多问题 - 但此时我能够通过我在 CRM 中的表单上放置的 javascript 从 CRM 成功向我的服务发出 GET 请求。

仅供参考(因为我目前不完全确定这些事情是否相关)...

  • 我必须在 IIS 中为我​​的服务设置匿名身份验证(CRM 有 我将依赖它自己的身份验证)
  • 我必须使用 CRM 安装的主机地址设置 Access-Control-Allow-Origin 的响应标头

因此,在完成这些操作后,我能够通过 GET 成功调用我的 Web 服务。我可以从 [HttpGet] 网络方法返回一个字符串。

但是,现在我需要通过 POST 调用一个 Web 方法来将一些数据发布到我的 Web 服务。因此,您可以在下面看到我对服务的实现以及我正在使用 POST 调用的 javascript。

using CRMService.Models;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Net.Mail;
using System.Web;
using System.Web.Http;

namespace CRMService.Controllers
{
    public class DefaultController : ApiController
    {
        // GET: Default
        public string Get()
        {
            return "Hi";
        }

        [HttpPost]
        public string GiveParameters(TestClass tc)
        {
            try
            {
                Dictionary<string, object> Parameters = new Dictionary<string, object>();
                Parameters.Add("id", tc.id);
                Parameters.Add("one", tc.one);
                Parameters.Add("two", tc.two);
                NonQuery("InsertTestItem", ConfigurationManager.ConnectionStrings["TestConnection"].ToString(), Parameters);
                return "success";
            }
            catch (Exception ex)
            {
                return "ex";
            }
        }               
    }
}


var new_budget = Xrm.Page.data.entity.attributes.get("new_budget").getValue();
var new_name = Xrm.Page.data.entity.attributes.get("new_name").getValue();
var id = Xrm.Page.data.entity.getId();
data = '{"TestClass":{"one":"' + new_name + '", "two":"'+ new_budget +'", "id":"'+ id +'"}}'

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "https://<hiddingMyUrl>/api/Default/GiveParameters",
    data: data,
    dataType: "json",
    success: function(data) {
        console.log("Success");
    },
    error: function(result) {
        console.log("Error");
    }
});   

当我进行此 POST 调用时,起初我可以看到它正在执行一些“预检”操作并发出 OPTIONS 请求 - 然后返回 403(我想,如果我没记错的话)。我通过在 IIS 中的 Web 服务中添加 Access-Control-Allow-Headers 标头并使用 Origin、X-Requested-With、Content-Type、Accept 的值查找并解决了该问题

这样做后,我的 POST 实际上给出了 200 状态代码 - 但是,正如您在我的代码中看到的那样,如果一切顺利,我应该会在数据库中看到数据。
..当然那么问题是...我的网络服务代码工作正常吗?通常我可以很容易地对此进行测试 - 但是我对 web api 相当陌生。在这一点上,我真的没有得到最好的测试方法——我不知道这是否与我的代码有关,或者 Web api 本身是否存在一些配置问题。

这是我的路由配置:

 public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { action = "Index", id = UrlParameter.Optional }
        );
    }

【问题讨论】:

    标签: javascript c# web-services testing asp.net-web-api


    【解决方案1】:

    您应该尝试使用 REST 客户端。 这里有两个不错的:

    我个人更喜欢 Postman,但实际上两者都很好。

    【讨论】:

    • 我试着在 Fiddler 中搞砸了一点。我已经多次使用 Fiddler 并且对它感到满意。但是,鉴于响应标头之类的,我无法通过 POST 甚至 GET。
    • 好的,所以使用邮递员我从我的 POST 中得到一个 415 - Unsupposed Media Type。 “此资源不支持请求实体的媒体类型‘text/plain’。”我查看了该错误并找到了这篇文章:stackoverflow.com/questions/22384354/… 我看到一些关于 CORS 的讨论,并且内容类型仍然需要设置为 application/json,并且在 CORS 情况下有一个特定的标题允许这样做。但是我找不到那个标题
    • 我认为你应该添加以下标题: Accept: application/json Content-Type: application/json
    • 你链接了我链接的同一个帖子。 ;) - 我已经添加了这些标头,但仍然收到 415。我收到此消息返回:此资源不支持请求实体的媒体类型“文本/纯文本”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 2017-11-14
    • 1970-01-01
    相关资源
    最近更新 更多