我有一个使用SharePoint 2010 REST API的应用程序。 在创建项目的过程中,有多个请求在彼此之后完成:
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;
}
答案 0 :(得分:2)
遇到同样的问题。
无论如何,第二个请求不遵循相同的身份验证过程。即使您初始化一个新的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
答案 1 :(得分:1)
虽然我仍然不知道实际问题是什么,但至少我找到了workaround:使用WebRequest
类代替HttpClient
。
答案 2 :(得分:-1)
我看到这个问题早就发布了。但我没有看到一个正确工作的解决方案尚未发布到此主题。
我遇到了完全相同的问题,即下一次请求仍然无法返回401 UnAuthorized。
我发现使用fiddler从SECOND请求开始,在请求中添加了一个Cookie,这可能是服务器发送的Set-Cookie响应的结果以及第一个响应。
所以这就是我如何处理这种情况 - 让UseCookies假:
new HttpClientHandler { Credentials = myCred, UseCookies = false }
这可以解决您的问题。希望这可以帮助那些正在寻找解决类似问题的人。