简体   繁体   中英

NullReferenceException in System.Web calling ServiceStack service with GetAsync from async ServiceStack service

I have a ServiceStack service that uses async from top to bottom. Below is a simplified example with all layers collapsed down to the Service Definition.

public async Task<ReadItemResponse> Get(Dto.ReadItem request)
{
    using (JsonServiceClient client = new JsonServiceClient("http://someserver/itemservice"))
    {
        ReadItemResponse response = await client.GetAsync(new ReadItem
        {
            ItemNumber = request.ItemNumber
        });

        return new Dto.ReadItemResponse
        {
            Item = new Dto.Item
            {
                ItemNumber = response.Item.ItemNumber,
                ItemName = response.Item.ItemName
            }
        };
    }
}

When I make numerous concurrent calls to the service, the above code causes a NullReferenceException in System.Web within 1 - 30 seconds.

System.Web.dll!System.Web.ThreadContext.AssociateWithCurrentThread(bool setImpersonationContext)
System.Web.dll!System.Web.HttpApplication.OnThreadEnterPrivate(bool setImpersonationContext)
System.Web.dll!System.Web.HttpApplication.System.Web.Util.ISyncContext.Enter()
System.Web.dll!System.Web.Util.SynchronizationHelper.SafeWrapCallback(System.Action action = {Method = {System.Reflection.RuntimeMethodInfo}})
System.Web.dll!System.Web.Util.SynchronizationHelper.QueueAsynchronous.AnonymousMethod__0(System.Threading.Tasks.Task _)
mscorlib.dll!System.Threading.Tasks.ContinuationTaskFromTask.InnerInvoke()
mscorlib.dll!System.Threading.Tasks.Task.Execute()
mscorlib.dll!System.Threading.Tasks.Task.ExecutionContextCallback(object obj)
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)
mscorlib.dll!System.Threading.Tasks.Task.ExecuteWithThreadLocal(ref System.Threading.Tasks.Task currentTaskSlot = Id = 1131, Status = Running, Method = "Void <QueueAsynchronous>b__0(System.Threading.Tasks.Task)")
mscorlib.dll!System.Threading.Tasks.Task.ExecuteEntry(bool bPreventDoubleExecution)
mscorlib.dll!System.Threading.Tasks.Task.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch()
mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
[Native to Managed Transition]

If I replace the JsonServiceClient with an async call to something like System.Net.WebRequest (to retrieve and desalinize a JSON response), I never see the exception.

I have tried the JsvServiceClient with the same results. I have tried to use the ConfigureAwait(false) with no success. I have ensured that the web.config file is calling out:

<compilation targetFramework="4.5.2" debug="true" />
<httpRuntime targetFramework="4.5" />

I have wrapped the body of the Get method with:

await Task.Factory.StartNew(() =>

which fixes the problem but drastically reduces the performance of the service. The throughput goes from being able to process 100 concurrent requests in 2-3 seconds to something closer to 20-40 seconds.

I have also been able to make async database calls without encountering the NullReferenceException.

This definitely feels like an issue with the ServiceClient. Any help would be greatly appreciated. Thanks!

使用JsonHttpClient代替JsonServiceClient修复了该问题。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM