简单版本
using Microsoft.Ajax.Utilities; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Client; using Microsoft.Xrm.Sdk.Query; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.ServiceModel.Description; using System.Web.Http; using System.Text; namespace DynamicApiTest.Controllers { public class ValuesController : ApiController { Uri orgServiceUri = new Uri("http://10.20.100.150:7777/Index/XRMServices/2011/Organization.svc");//组织服务地址 ClientCredentials clientCredentials = new ClientCredentials(); //连接dynamic的账号和密码 public void run() { clientCredentials.Windows.ClientCredential = new NetworkCredential("lanhai", "P@ssw0rd", "LANHAI"); } // GET api/values public EntityCollection Get() { run(); using (OrganizationServiceProxy sev = new OrganizationServiceProxy(orgServiceUri, null, clientCredentials, null)) { QueryExpression q = new QueryExpression("new_student"); q.ColumnSet = new ColumnSet(true); EntityCollection ee = sev.RetrieveMultiple(q); StringBuilder sr = new StringBuilder(); return ee; } } // GET api/values/5 public string Get(int id) { return "value"; } // POST api/values public void Post([FromBody] string value) { } // PUT api/values/5 public void Put(int id, [FromBody] string value) { } // DELETE api/values/5 public void Delete(int id) { } } }
前端接收
<h2>Test</h2> <script src="~/Scripts/jquery-3.4.1.js"></script> <div> <ul id="entityname"> </ul> </div> <script> $.ajax({ url: "/api/values", type: "get", dataType: "json", contentType: "application/json", success: function (data) { console.log(data); }, error: function (data) { console.log("lose"); } }) </script>
将服务地址和登录账号、密码写入配置文件中
单独写一个servicehelper类来访问dynamic数据
using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Client; using Microsoft.Xrm.Sdk.Discovery; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Web; namespace DynamicApiTest.Models { public class ServiceHelper { private static OrganizationServiceProxy organizationProxy { get; set; } public static OrganizationServiceProxy InitOrganizationProxy() { string _discoveryServiceAddress = ConfigurationManager.AppSettings["DiscoveryServiceAddress"];//获取组织服务地址 IServiceManagement<IDiscoveryService> serviceManagement = ServiceConfigurationFactory.CreateManagement<IDiscoveryService>(new Uri(_discoveryServiceAddress)); AuthenticationProviderType endpointType = serviceManagement.AuthenticationType; AuthenticationCredentials authCredentials = GetCredentials(endpointType); string organizationUri = ConfigurationManager.AppSettings["DiscoveryServiceAddress"]; if (!String.IsNullOrWhiteSpace(organizationUri)) { IServiceManagement<IOrganizationService> orgServiceManagement = ServiceConfigurationFactory.CreateManagement<IOrganizationService>(new Uri(organizationUri)); AuthenticationCredentials credentials = GetCredentials(endpointType); return GetProxy<IOrganizationService, OrganizationServiceProxy>(orgServiceManagement, credentials); } else throw new Exception("未连接服务!"); } private static AuthenticationCredentials GetCredentials(AuthenticationProviderType endpointType) { string _userName = ConfigurationManager.AppSettings["UserName"]; string _password = ConfigurationManager.AppSettings["Password"]; AuthenticationCredentials authCredentials = new AuthenticationCredentials(); switch (endpointType) { case AuthenticationProviderType.ActiveDirectory: authCredentials.ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential(_userName, _password); break; case AuthenticationProviderType.Federation: case AuthenticationProviderType.OnlineFederation: authCredentials.ClientCredentials.UserName.UserName = _userName; authCredentials.ClientCredentials.UserName.Password = _password; break; default: break; } return authCredentials; } private static TProxy GetProxy<TService, TProxy>(IServiceManagement<TService> serviceManagement, AuthenticationCredentials authCredentials) where TService : class where TProxy : ServiceProxy<TService> { Type classType = typeof(TProxy); if (serviceManagement.AuthenticationType != AuthenticationProviderType.ActiveDirectory) { AuthenticationCredentials tokenCredentials = serviceManagement.Authenticate(authCredentials); return (TProxy)classType .GetConstructor(new Type[] { typeof(IServiceManagement<TService>), typeof(SecurityTokenResponse) }) .Invoke(new object[] { serviceManagement, tokenCredentials.SecurityTokenResponse }); } return (TProxy)classType .GetConstructor(new Type[] { typeof(IServiceManagement<TService>), typeof(System.ServiceModel.Description.ClientCredentials) }) .Invoke(new object[] { serviceManagement, authCredentials.ClientCredentials }); } } }
ResultDTD 类
public class ResultDTD { public int code { get; set; } public object data { get; set; } }
在api中访问dynamic数据,并返回一个json字符串
public IHttpActionResult Get() { using (OrganizationServiceProxy sev = ServiceHelper.InitOrganizationProxy()) { //查询对应实体信息,返回一个json字符串 string xml = $@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'> <entity name='tx_testentity_1'> <attribute name='tx_testentity_1id' /> <attribute name='tx_name' /> <attribute name='createdon' /> <order attribute='tx_name' descending='false' /> </entity> </fetch>"; var fetch = new FetchExpression(xml); EntityCollection response = sev.RetrieveMultiple(fetch);//获取实体信息 ResultDTD result = new ResultDTD();//返回的数据类 result.code = 200;//状态码 if (response.Entities.Count > 0) { result.data = response.Entities.Select(x => new new_testentiyt_1//根据查询到的数据封装的一个类 { new_name = x.GetAttributeValue<string>("tx_name")//fetch查询到的数据 }); } //将json字符串转化为list集合 //string value = JsonConvert.SerializeObject(result.data); //ls = JsonConvert.DeserializeObject<List<类名称>>(value); return Json(result); } }
//返回结果
跨域设置
origins:允许访问的域名,多个域名以逗号分隔。使用“*”全部允许。
headers:配置所支持的资源,使用“*”全部允许,使用null或“”不允许。
methods:配置支持的请求方法,使用“*”全部允许,使用null或“”不允许。