簡體   English   中英

401 在第二個 HttpClient/HttpWebRequest 調用上未經授權

[英]401 Unauthorized on SECOND HttpClient/HttpWebRequest call

我有一個使用 SharePoint 2010 REST API 的應用程序。 在創建 Item 的過程中,有多個請求依次完成:

1 次調用:從列表中獲取項目:成功

2 調用:創建項目:401 未授權

如果我這樣做也是一樣的:

1 次調用:創建項目:成功

2 呼叫:刪除項目:401 未經授權

我所知道的是,我的功能獨立工作,當他們在彼此之后叫他們工作。 當我在創建項目后關閉應用程序(Windows Phone 8.1 應用程序)並在重新啟動時嘗試刪除它工作的項目。

首先,我認為這與我處理字段的方式有關,所以我在 finally 語句中將它們更改為 NULL 但這不起作用。

    public async Task<bool> CreateNewItem(NewItem myNewItem)
    {   
        try
        {
            StatusBar statusBar = await MyStatusBar.ShowStatusBar("Creating new List Item.");
            //Retrieving Settings from Saved file
            mySettings = await MyCredentials.GetMySettings();
            myCred = new NetworkCredential(mySettings.UserName, mySettings.Password, mySettings.Domain);

            using (var handler = new HttpClientHandler { Credentials = myCred })
            {
                HttpClient client = new HttpClient(handler);
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                NewItem newItem = myNewItem;
                var jsonObject = JsonConvert.SerializeObject(newItem);

                HttpResponseMessage response = await client.PostAsync(new Uri(baseUrl + listNameHourRegistration), new StringContent(jsonObject.ToString(), Encoding.Unicode, "application/json"));
                response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                response.EnsureSuccessStatusCode();

                string responseMessage = await response.Content.ReadAsStringAsync();

                client.Dispose();

                if (responseMessage.Length > 0)
                     return true;
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
            return false;
        }
        finally
        {
            request = null;
            response = null;
            myCred = null;
            mySettings = null;
        }
        
        return false;
    }

剛遇到同樣的問題。

無論如何,第二個請求不會遵循相同的身份驗證過程。 即使您初始化了一個新的HttpClient對象。 我嗅到了HTTP流量。 交通

在第一個請求之后,我將使用不同的憑據進行另一個操作。 這也以401結尾。我真的很困惑...

NTLM握手似乎卡在了6個步驟的第2個步驟中http://www.innovation.ch/personal/ronald/ntlm.html

編輯:您可能要使用CSOM。 http://social.msdn.microsoft.com/Forums/office/en-US/efd12f11-cdb3-4b28-a9e0-32bfab71a419/windows-phone-81-sdk-for-sharepoint-csom?forum=sharepointdevelopment

雖然我仍然不知道實際的問題是什么,但至少我找到了一種解決方法 :使用WebRequest類而不是HttpClient

當我意識到每次調用端點時都添加標題時,我遇到了同樣的錯誤。 希望這會幫助某人。

相反,我在我的類構造函數中初始化了 HttpClient 實例並在那里設置了標頭。 我還了解到只使用 1 個實例而不是使用“使用”重新創建是更好的做法(請參閱本文https://www.aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/

這是我的最終解決方案:我正在循環中從另一個類調用 CallApiAsync。

class ApiShared
    {
        private HttpClient client;

        public ApiShared()  {
            client = new HttpClient();
            client.DefaultRequestHeaders.Add("x-api-key", ConfigurationManager.AppSettings["ApiKey"]);
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        }

        public async Task<ApiResponse_Root> CallApiAsync(string endpoint)
        {
            // Make API call
            Uri endpointUri = new Uri(endpoint);
            var stringTask = client.GetStringAsync(endpointUri);
            var data = JsonConvert.DeserializeObject<ApiResponse_Root>(await stringTask);

            return data;
        }
    }

在 Windows 機器上,您可以通過以下注冊表設置更改來解決此問題:

轉到以下注冊表項:

Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa

現在添加一個新的 DWORD 到 Lsa 文件夾,名為: DisableLoopBackCheck並將其設置為1

我看到這個問題已經發布很久了。 但是我沒有看到正確的解決方案發布到此線程。

我面臨着完全相同的問題,下一個請求一直失敗,並返回401 UnAuthorized。

我發現使用fiddler從SECOND請求開始,向該請求添加了一個Cookie,這可能是服務器與第一個響應一起發送的Set-Cookie響應的結果。

所以這是我處理情況的方法-將UseCookies設為false:

new HttpClientHandler { Credentials = myCred, UseCookies = false }

這樣可以解決您的問題。 希望這對正在尋找類似問題的解決方案的人有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM