Dan*_*sen 10 vb.net crm dynamics-crm asp.net-web-api dynamics-crm-webapi
我在CRM中构建了一个自定义操作,我需要通过它的WebAPI来解决这个问题.自定义操作已激活,我在创建CRM时没有出现任何错误.
我尝试从VB.NET应用程序调用此操作,如:
Dim httpch As New HttpClientHandler
Dim requestUri As String = "contacts(1fcfd54a-15d3-e611-80dc-0050569ea396)/Microsoft.Dynamics.CRM.new_addnotetocontact"
httpch.Credentials = New NetworkCredential("username", "password", "domain")
Dim httpClient As New HttpClient(httpch)
httpClient.BaseAddress = New Uri(CRMWebApiUri)
httpClient.Timeout = New TimeSpan(0, 2, 0)
httpClient.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0")
httpClient.DefaultRequestHeaders.Add("OData-Version", "4.0")
httpClient.DefaultRequestHeaders.Add("Prefer", "odata.include-annotations='OData.Community.Display.V1.FormattedValue'")
httpClient.DefaultRequestHeaders.Accept.Add(New MediaTypeWithQualityHeaderValue("application/json"))
Dim jsonNote As JObject = New JObject(New JProperty("NoteTitle", "'Mails have been deleted'"), New JProperty("NoteText", "This contacts SmarterMail data has been deleted due to inactivity"))
Dim postData = New StringContent(jsonNote.ToString(), Encoding.UTF8, "application/json")
Dim retrieveContactResponse As HttpResponseMessage = httpClient.PostAsync(requestUri, postData).Result
Run Code Online (Sandbox Code Playgroud)
我得到的是状态400,其中包含一条消息:
请求消息具有未解析的参数.
我可以对同一个站点进行其他调用,并以所有联系人为例
这是什么意思,我该如何解决?
这是什么意思,我该如何解决?
在CRM中,当您在调用操作时收到此错误.那背后可能有三个原因
- 你传递错误的一些参数.(确保动作名称正确传递)
- 您的操作未激活
- 你的动作名称是重复的,一个动作处于活动模式,另一个动作处于草稿状态.(因为这是从CRM方面完成的,一个人必须在草稿中,只有两个同名动作同时不活动.)
2号已经处理好,因为它已经声明自定义动作已被激活.
如果您在CRM中导入了两次操作或无意中创建了两个具有相同名称的操作,则链接文章中会解决第3项问题.
为了解决1号问题,我建议创建一个对象模型来保存要发送的数据
Public Class Note
Public Property NoteTitle As String
Public Property NoteText As String
End Class
Run Code Online (Sandbox Code Playgroud)
CRM对于正确的参数格式化非常挑剔.参数名称也区分大小写.将''在NoteTitle序列化时,会导致一些问题.此外,如果可能的话,使用NewtonSoft.Json来制作JSON有效负载,而不是尝试自己构建它.
'Handler with credentials
Dim httpClientHandler As New HttpClientHandler With {
.Credentials = New NetworkCredential("username", "password", "domain")}
'Create and configure HTTP Client
Dim httpClient As New HttpClient(httpClientHandler) With {
.BaseAddress = New Uri(CRMWebApiUri),
.Timeout = New TimeSpan(0, 2, 0)}
httpClient.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0")
httpClient.DefaultRequestHeaders.Add("OData-Version", "4.0")
httpClient.DefaultRequestHeaders.Add("Prefer", "odata.include-annotations='OData.Community.Display.V1.FormattedValue'")
httpClient.DefaultRequestHeaders.Accept.Add(New MediaTypeWithQualityHeaderValue("application/json"))
'Create and populate data to be sent
Dim model As New Note With {
.NoteTitle = "Mails have been deleted",
.NoteText = "This contacts SmarterMail data has been deleted due to inactivity"}
'Serialize mode to well formed JSON
Dim json As String = JsonConvert.SerializeObject(model)
Dim postData = New StringContent(json, Encoding.UTF8, "application/json")
'invoking action using the fully qualified namespace of action message
Dim requestUri As String = "contacts(1fcfd54a-15d3-e611-80dc-0050569ea396)/Microsoft.Dynamics.CRM.new_addnotetocontact"
'POST the data
Dim retrieveContactResponse As HttpResponseMessage = Await httpClient.PostAsync(requestUri, postData)
Run Code Online (Sandbox Code Playgroud)
其他参考Dynamics CRM 2016:使用Web API操作
调用绑定函数时,必须包含函数的全名,包括
Microsoft.Dynamics.CRM命名空间.如果您不包含全名,您将收到以下错误:状态代码:400请求消息具有未解析的参数.
我前一段时间修复了这个问题,但没有时间回来回答。就我而言,问题在于我自己提出请求的方式
而不是问题中所述的以下方式:
Dim postData = New StringContent(jsonNote.ToString(), Encoding.UTF8, "application/json")
Dim retrieveContactResponse As HttpResponseMessage = httpClient.PostAsync(requestUri, postData).Result
Run Code Online (Sandbox Code Playgroud)
我没有使用 httpClient.PostAsync 方法并直接提供 StringContent 对象,而是使用 HttpRequestMessage 对象并提供 StringContent 对象,然后将 HttpRequestMessage 对象提供给 httpClient 的 SendAsync 方法,这似乎解决了我的问题,因为它现在正在工作。另请注意,在最初的问题中,我在要发布的 JObject 中的第一个 JProperty 的值中有引号,我不确定这与它有什么关系,但只是将其发布在这里,因为它与原始的不同代码:
Dim jsonNote As JObject = New JObject(New JProperty("NoteTitle", "Mails have been deleted"), New JProperty("NoteText", "This contact's SmarterMail data has been deleted automatically due to inactivity on their CRM account"))
...
Dim reqMsg As New HttpRequestMessage(HttpMethod.Post, CRMWebApiUri + requestUri)
reqMsg.Content = New StringContent(jsonNote.ToString(), Encoding.UTF8, "application/json")
Dim retrieveContactResponse As HttpResponseMessage = httpClient.SendAsync(reqMsg).Result
Run Code Online (Sandbox Code Playgroud)