2012年9月12日更新:
私は自分のコードを同僚と共有しましたが、最初は何も変更せずにすべてが正常に機能しました。だから、私の箱には何か環境があるに違いない、誰か考えがありますか?
以下の更新を参照してください
設定:
.Net 4.5
セルフホスト(コンソールアプリ).Net 4.5WebAPIアプリケーション
MSTestを使用してハーネスをテストする
私のWebAPIアプリは、ほとんどがREST ApiControllerでいっぱいです。これらはすべて、標準のCRUDタイプのもので期待どおりに正しく機能します。これで、REST CRUDモデルにうまく適合しないように見える要件(内部キューにいくつかのオブジェクトを追加する)があります。この記事は、WebAPIで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 });
プロキシに対してテストを実行してもエラーは発生しませんが、コントローラーメソッド内でブレークポイントが発生することはなく、メソッドも入力されません。メッセージがコンソールに表示されます。varmsg行のブレークラインもヒットしません。何らかの理由で、これを行うためにHttpClientオブジェクトを適切に使用しているようには見えません。
繰り返しになりますが、このWeb APIアプリは、他の多くのAPIコントローラーで問題なく動作していますが、それらはすべて標準の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行目は通話のある行です。