После нахождения не столь очевидной документации на salesforce.com по реализации конечной точки оддаты для внешнего источника данных / внешних объектов мне стало очевидно, что salesforce.com пытается вызвать семантику POST для обновления в внешний объект, но также добавляет X-HTTP-METHOD, установленный как PATCH.
Итак, решением было реализовать следующий класс:
public class MethodOverrideHandler : DelegatingHandler
{
readonly string[] _methods = { "DELETE", "HEAD", "PUT", "PATCH", "MERGE" };
const string _header1 = "X-HTTP-Method-Override";
const string _header2 = "X-HTTP-Method";//salesforce special behavior???
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
// Check for HTTP POST with the X-HTTP-Method-Override header.
if (request.Method == HttpMethod.Post && request.Headers.Contains(_header1))
{
// Check if the header value is in our methods list.
var method = request.Headers.GetValues(_header1).FirstOrDefault();
if (_methods.Contains(method, StringComparer.InvariantCultureIgnoreCase))
{
// Change the request method.
request.Method = new HttpMethod(method);
}
}
else if (request.Method == HttpMethod.Post && request.Headers.Contains(_header2))
{
// Check if the header value is in our methods list.
var method = request.Headers.GetValues(_header2).FirstOrDefault();
if (_methods.Contains(method, StringComparer.InvariantCultureIgnoreCase))
{
// Change the request method.
request.Method = new HttpMethod(method);
}
}
return base.SendAsync(request, cancellationToken);
}
}
и зарегистрируйте его в WebApiConfig.Register(HttpConfiguration config)
следующим образом:
config.MessageHandlers.Add(new MethodOverrideHandler());
Теперь POST, не соответствующий odata, для операций обновления salesforce на Внешнем объекте будет делегирован реализации стандартов odata (в ODataController), соответствующей стандарту, метода PUT, который я первоначально разместил.
Я надеюсь, что это поможет кому-то в будущем ...