2012 年 9 月 12 日更新:
我与一位同事分享了我的代码,第一次对他来说一切正常,没有任何更改。所以,我的盒子上一定有一些环保的东西,有人有什么想法吗?
请参阅下面的更新
设置:
.Net 4.5
自托管(控制台应用程序).Net 4.5 Web API 应用程序
使用 MSTest 测试工具
我的 Web API 应用程序大部分都充满了 REST ApiControllers,它们都可以正常工作,正如我对标准 CRUD 类型的东西所期望的那样。现在我有一个需求(将一些对象添加到内部队列),这似乎不太适合 REST CRUD 模型。我发现这篇文章似乎说您可以在 Web API 中执行 RPC 样式的非 REST 操作就好了。
我写了一个新的控制器,看起来像这样:
public class TaskInstanceQueueController : ApiController
{
public void Queue(TaskInstance taskInstance)
{
// Do something with my taskInstance
Console.WriteLine("Method entered!");
}
}
在调用它的代理类中,我的代码如下所示:
public class TaskInstanceQueueProxy : ITaskInstanceQueueProxy
{
readonly HttpClient _client = new HttpClient();
public TaskInstanceQueueProxy()
{
var apiBaseUrl = System.Configuration.ConfigurationManager.AppSettings["APIBaseUrl"];
_client.BaseAddress = new Uri(apiBaseUrl);
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
public void QueueTaskInstances(TaskInstance taskInstance)
{
QueueTaskInstanceViaAPI(taskInstance);
}
private async void QueueTaskInstanceViaAPI(TaskInstance taskInstance)
{
var response = await _client.PostAsJsonAsync("api/TaskInstanceQueue/Queue", taskInstance);
var msg = response.EnsureSuccessStatusCode();
}
}
这是我的路线:
config.Routes.MapHttpRoute("API Default", "api/{controller}/{id}", new {id = RouteParameter.Optional});
config.Routes.MapHttpRoute("API RPC Style", "api/{controller}/{action}", new { id = RouteParameter.Optional });
当我对我的代理运行测试时,我没有收到任何错误,但我的控制器方法中没有断点,也没有输入方法!消息出现在控制台中。var msg 行上的断线也永远不会命中。无论出于何种原因,我似乎都没有正确使用 HttpClient 对象来执行此操作。
同样,这个 web api 应用程序与许多其他 apicontroller 一起工作得很好,但它们都在做标准的 REST 东西。
有人有任何线索吗?
更新
如果我在 PostAsJsonAsync 调用周围放置一个 try/catch,我会得到以下信息:
A first chance exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll
System.Threading.ThreadAbortException: Thread was being aborted.
at System.Threading.Tasks.TaskHelpers.RunSynchronously(Action action, CancellationToken token)
at System.Net.Http.Formatting.JsonMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext)
at System.Net.Http.ObjectContent.SerializeToStreamAsync(Stream stream, TransportContext context)
at System.Net.Http.HttpContent.LoadIntoBufferAsync(Int64 maxBufferSize)
at System.Net.Http.HttpClientHandler.PrepareAndStartContentUpload(RequestState state)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at TaskManagerProxy.TaskInstanceQueueProxy.<QueueTaskInstanceViaAPI>d__0.MoveNext() in c:\Moso\MOSO\MOSO.Infrastructure\tm\TaskManagerProxy\TaskManagerProxy\TaskInstanceQueueProxy.cs:line 30
第 30 行是呼叫所在的行。