我正在使用HTTPClient调用简单的Web Api服务。该服务接受一个参数,例如URL,并将其保存在SQL表中,将该URL转换为guid,并将其返回给调用方。下面的代码在SharePoint Web部件内使用,可通过按钮单击事件处理程序进行调用。
public void DisplayUrl(string host,string paramUrl)
{
string longUrl = string.Format("https://{0}-UrlApi/AddUrl?longUrl={1}", host,paramUrl);
var result = GetUrl(longUrl).GetAwaiter().GetResult();
tboxResults.Text = result.ShortUrl;
}
protected static async Task<ShortUrlResponse> GetUrl(string baseUrl)
{
HttpClientHandler handler = new HttpClientHandler();
handler.UseDefaultCredentials = true;
using (var client = new HttpClient(handler))
{
var response = client.GetAsync(baseUrl).Result;
if (response.IsSuccessStatusCode)
{
HttpResponseMessage response1 = response;
response.EnsureSuccessStatusCode();
var resp = await response.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject<ShortUrlResponse>(resp);
return result;
}
return null;
}
}
该Web部件已部署到测试环境,并且当我从测试服务器外部的计算机中的浏览器中打开页面时,出现此错误。有时我也将其放入测试服务器中,但是第二次单击按钮后,它可以正常工作,例如在开发机器中无法正常工作。
这是我得到的错误。
错误消息:发生一个或多个错误。
InnerException: System.Net.Http.HttpRequestException:发送请求时发生错误。 ---> System.Net.WebException:远程服务器 返回错误:(401)未经授权。 -> System.ComponentModel.Win32Exception:登录尝试在以下位置失败 System.Net.NTAuthentication.GetOutgoingBlob(Byte [] entryBlob, 布尔throwOnError,SecurityStatus&statusCode) System.Net.NTAuthentication.GetOutgoingBlob(字符串传入Blob)位于 System.Net.NegotiateClient.DoAuthenticate(字符串挑战,WebRequest webRequest,ICredentials凭据,布尔值preAuthenticate)位于 System.Net.NegotiateClient.Authenticate(字符串挑战,WebRequest webRequest,ICredentials凭据) System.Net.AuthenticationManagerDefault.Authenticate(字符串质询, WebRequest请求,ICredentials凭证)位于 System.Net.AuthenticationState.AttemptAuthenticate(HttpWebRequest httpWebRequest,ICredentials authInfo),网址为 System.Net.HttpWebRequest.CheckResubmitForAuth()位于 System.Net.HttpWebRequest.CheckResubmit(Exception&e,Boolean& disableUpload)-内部异常堆栈跟踪结束--在 System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)位于 System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar) ---内部异常堆栈跟踪结束StackTrace:
在System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
TUrlControl:
在System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)处
在AIntranet.WebParts.TUrl.TUrlUserControl.d__3.MoveNext()从上一个引发异常的位置开始的堆栈跟踪结束
在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task 任务)
在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
在AIntranet.WebParts.TUrl.TUrlUserControl.DisplayUrl(字符串主机,字符串paramUrl)
在AIntranet.WebParts.TUrl.TUrlUserControl.b__1_0()
在Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess(CodeToRunElevated secureCode)
在Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(WaitCallback secureCode,对象参数)
在Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(CodeToRunElevated secureCode)
在AIntranet.WebParts.TUrl.TUrlUserControl.btnTUrl_Click(Object sender,EventArgs e)