Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET WebApi中的Fire forget和单向调用_C#_Asynchronous_Asp.net Web Api_Task Parallel Library_Async Ctp - Fatal编程技术网

C# ASP.NET WebApi中的Fire forget和单向调用

C# ASP.NET WebApi中的Fire forget和单向调用,c#,asynchronous,asp.net-web-api,task-parallel-library,async-ctp,C#,Asynchronous,Asp.net Web Api,Task Parallel Library,Async Ctp,我完全理解HTTP world并不是单向调用的最佳选择,而WebApi最适合HTTP详细通信。毫无疑问,WCF是这里的赢家。但是,如果您已经有了一个ApicController,其中暴露了一堆动词,并且在某个时候您还需要一个单向调用,该怎么办?您不想为此托管/维护另一个服务(WCF) Task<HttpResponseMessage> response = client.PostAsJsonAsync<Log>("api/log", log) Task response

我完全理解HTTP world并不是单向调用的最佳选择,而WebApi最适合HTTP详细通信。毫无疑问,WCF是这里的赢家。但是,如果您已经有了一个ApicController,其中暴露了一堆动词,并且在某个时候您还需要一个单向调用,该怎么办?您不想为此托管/维护另一个服务(WCF)

Task<HttpResponseMessage> response = client.PostAsJsonAsync<Log>("api/log", log)
Task response=client.PostAsJsonAsync(“api/log”,log)

如果你没有处理好回应,那么你就有了类似于“火与忘”的东西。这是WebApi中的唯一方法还是有其他解决方案?

您最好的选择是启动新任务,并立即发送响应,而不是返回任务:

public void PostDoFireAndForget() // and NOT public Task PostDoFireAndForget()
    {
        Task.Factory.StartNew
            (() =>
                {
                    // ... start the operation here
                    // make sure you have an exception handler!!
                }

            );

    }

为什么不这样调用并忽略返回的任务

client.PostAsJsonAsync<Log>("api/log", log);
client.PostAsJsonAsync(“api/log”,log);

我对所有调用都这样做,并在必要时使用响应管道中的处理程序来处理响应。

我看到的唯一问题是,如果调用方法在实际远程调用执行之前结束,则调用可能永远不会发生,因为线程与主线程一起被终止。在采用这个解决方案时,你应该考虑。这是火灾固有的问题,忘记了请求响应协议。但机会真的很重要slim@DarrelMiller因为返回任务意味着在任务完成之前不会返回响应,这与OP想要的不一样。@Aliostad任何对XXXAsync的调用都应该很快返回。OP想做FireAnd忘记我解释的意思,他不在乎回答。@Darreller如果你不返回任务,那就好了。但您的代码是危险的,因为您没有观察到任务异常。由于未观察到的任务异常,此代码具有潜在危险。在fire and forget环境中,客户端上只应处理通信异常。在通信出现问题的情况下,调用线程将失败并抛出异常。其余的问题是服务本身的问题,因此未观察到的任务异常在这里并不危险。@Darrel您是否将WebApi动词定义为void或用于单向调用的任务?对于这个特别的问题,我认为void应该是首选,因为你没有暗示任何等待/等待O/W操作的能力。我希望你能分享结果和选择,或者添加一个答案。这对其他人有帮助。