10

我在 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

我得到的是带有消息的状态 400:

请求消息具有未解析的参数。

我可以向同一站点拨打其他电话并获取所有联系人作为示例

这是什么意思,我该如何解决?

4

3 回答 3

6

这是什么意思,我该如何解决?

引用请求消息具有未解析的参数。

在 CRM 中,当您在调用操作时收到此错误。那么这背后可能有三个原因

  1. 您传递的某些参数错误。(确保动作名称正确通过)
  2. 您的操作未激活
  3. 您的动作名称重复,一个动作处于活动模式,另一个处于草稿状态。(因为这是从 CRM 方面完成的,一个必须处于草稿状态,只有两个相同名称的动作不会同时处于活动状态。)

第 2 项已经处理,因为它已经声明自定义操作已激活。

第 3 项在链接文章中得到解决,如果您可能在 CRM 中两次导入操作或无意中创建了两个具有相同名称的操作,则它是合理的。

为了解决第一,我建议创建一个对象模型来保存要发送的数据

Public Class Note 
    Public Property NoteTitle As String
    Public Property NoteText As String
End Class

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)

其他参考Dynamics CRM 2016:使用 Web API 操作

调用绑定函数时,必须包含函数的全名,包括Microsoft.Dynamics.CRM命名空间。如果不包含全名,您将收到以下错误:状态代码:400 请求消息具有未解析的参数。

于 2017-07-18T22:56:42.130 回答
0

我前段时间解决了这个问题,但没有时间回来回答它。就我而言,问题是我自己提出请求的方式

而不是问题中所述的以下方式:

Dim postData = New StringContent(jsonNote.ToString(), Encoding.UTF8, "application/json")
Dim retrieveContactResponse As HttpResponseMessage = httpClient.PostAsync(requestUri, postData).Result

我没有使用 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
于 2017-07-26T12:50:40.957 回答
0

将名称更改new_addnotetocontactnew_AddNoteToContact,它将起作用。

Dim requestUri As String = "contacts(1fcfd54a-15d3-e611-80dc-0050569ea396)/Microsoft.Dynamics.CRM.new_AddNoteToContact"

流程架构如下:

<Action Name="new_AddNoteToContact" IsBound="true">
  <Parameter Name="entity" Type="mscrm.contact" Nullable="false" />
  <Parameter Name="NoteTitle" Type="Edm.String" Nullable="false" Unicode="false" />
  <Parameter Name="NoteText" Type="Edm.String" Nullable="false" Unicode="false" />
  <ReturnType Type="mscrm.annotation" Nullable="false" />
</Action>

唯一名称: new_AddNoteToContact

参考:https ://msdn.microsoft.com/en-us/library/mt607600.aspx#Anchor_3

更新:如果您在创建操作后编辑了唯一名称,则将在Processes实体中创建重复项。请从 Adv.Find 中删除受骗者

于 2017-07-25T18:40:11.693 回答