【发布时间】: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