401在SECOND HttpClient / HttpWebRequest上调用未授权

我有一个使用SharePoint 2010 REST API的应用程序。 在创建项目的过程中,有多个请求在彼此之后完成:

1呼叫:从列表中获取项目:成功

2呼叫:创建项目:401未经授权

如果我这样做,这是相同的:

1呼叫:创建项目:成功

2呼叫:删除项目:401未经授权

我所知道的是,我的function是分开工作的,当它们相互呼叫时它们不起作用。 当我在创建项目后关闭应用程序(Windows Phone 8.1应用程序)并重新启动时尝试删除它的工作项目。

首先我认为它与处理我的字段的方式有关,所以我在finally语句中将它们更改为NULL但是这不起作用。

public async Task 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; } 

刚遇到同样的问题。

无论如何,第二个请求不遵循相同的身份validation过程。 即使您初始化一个新的HttpClient对象。 我嗅到了HTTP流量。 交通

在第一个请求之后,我正在使用不同的凭据执行另一个 这也是以401结尾。我真的很困惑……

似乎NTLM Handshake陷入了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

我看到这个问题早就发布了。 但我没有看到一个正确工作的解决方案发布到这个线程。

我遇到了完全相同的问题,其中下一个请求继续失败返回401 UnAuthorized。

我发现使用fiddler从SECOND请求开始,在请求中添加了一个Cookie,这可能是服务器发送的Set-Cookie响应的结果以及第一个响应。

所以这就是我如何处理这种情况 – 使UseCookies假:

 new HttpClientHandler { Credentials = myCred, UseCookies = false } 

这应该可以解决您的问题。 希望这可以帮助那些正在寻找解决类似问题的人。