3

これは、 Stackoverflowでの以前の質問の 1 つに対するフォローアップの質問です。

HTTPClient と Sharepoint 2013 REST API を使用して、Sharepoint Online Premise に接続して「ドキュメント ライブラリ」のドキュメントを取得しようとしています。

ここで行っているのは、HttpClient を使用した単純な匿名 HTTP GET 呼び出しだけです。

コードは次のとおりです。

System.Net.Http.HttpClient _Client = new System.Net.Http.HttpClient();
_Client.BaseAddress = new Uri("https://test.sharepoint.com/_vti_bin/ListData.svc");
_Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/atom+xml"));
_Client.DefaultRequestHeaders.Add("auth_user", "test@test.onmicrosoft.com");
_Client.DefaultRequestHeaders.Add("auth_pass", "test");
_Client.DefaultRequestHeaders.Add("Accept", "application/json;odata=verbose");
HttpResponseMessage resp = _Client.GetAsync(new Uri("https://test.sharepoint.com/_vti_bin/ListData.svc/Documents()")).Result;
string respString = resp.Content.ReadAsStringAsync().Result;

そして、私は次のエラーが発生しています:

トランスポート接続からデータを読み取れません: 接続が閉じられました。

スタック トレースは次のとおりです。

[IOException: Unable to read data from the transport connection: The connection was closed.]
   System.Net.ConnectStream.EndRead(IAsyncResult asyncResult) +6501654
   System.Net.Http.WebExceptionWrapperStream.EndRead(IAsyncResult asyncResult) +30
   System.Net.Http.StreamToStreamCopy.BufferReadCallback(IAsyncResult ar) +54

[HttpRequestException: Error while copying content to a stream.]

[AggregateException: One or more errors occurred.]
   System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) +3569193
   System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) +73
   System.Threading.Tasks.Task`1.get_Result() +10522673
   WebApp.Test.Page_Load(Object sender, EventArgs e) in @Location
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51
   System.Web.UI.Control.OnLoad(EventArgs e) +92
   System.Web.UI.Control.LoadRecursive() +54
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +772

問題を解決するためのアイデアを得るために、さまざまなブログ/記事を調べましたが、まだ解決策が見つかりません。

これについて何か考えはありますか?

4

3 に答える 3

1

これはあなたを助けるでしょう:

ServicePointManager.ServerCertificateValidationCallback = 
    delegate(object s, X509Certificate certificate, X509Chain chain, 
            SslPolicyErrors sslPolicyErrors) 
    { 
        return true; 
    };

の前に置きrequestます。

于 2013-12-10T16:49:20.600 に答える
0

資格情報を渡そうとしている方法は、SharePoint Online ではサポートされ ていません。

Microsoftは、SharePoint Online リソースにアクセスするための資格情報を提供するSharePointOnlineCredentials クラスを含む SharePointOnline Client Components SDKをリリースしました。

次の例は、SharePoint Onlineにアクセスするために、SharePointOnlineCredentials クラスHttpClient クラスで利用する方法を示しています。

public class SPHttpClientHandler : HttpClientHandler
{
    public SPHttpClientHandler(Uri webUri, string userName, string password)
    {
        CookieContainer = GetAuthCookies(webUri, userName, password);
        FormatType = FormatType.Json;
    }


    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        request.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
        if(FormatType == FormatType.Json)
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        return base.SendAsync(request, cancellationToken);
    }


    /// <summary>
    /// Retrieve SPO Auth Cookies 
    /// </summary>
    /// <param name="webUri"></param>
    /// <param name="userName"></param>
    /// <param name="password"></param>
    /// <returns></returns>
    private static CookieContainer GetAuthCookies(Uri webUri, string userName, string password)
    {
        var securePassword = new SecureString();
        foreach (var c in password) { securePassword.AppendChar(c); }
        var credentials = new SharePointOnlineCredentials(userName, securePassword);
        var authCookie = credentials.GetAuthenticationCookie(webUri);
        var cookieContainer = new CookieContainer();
        cookieContainer.SetCookies(webUri, authCookie);
        return cookieContainer;
    }


    public FormatType FormatType { get; set; }
}

public enum FormatType
{
    Json,
    Xml
}

要点: SPHttpClientHandler.cs

前提条件: SharePoint Online クライアント コンポーネント SDKのSharePointOnlineCredentials クラスが認証に使用されます。

使用法

 var handler = new SPHttpClientHandler(webUri, userName, password);
 using (var client = new HttpClient(handler))
 {
      client.BaseAddress = webUri;
      var result = client.GetAsync("/_vti_bin/ListData.svc/Documents").Result;
      var content = result.Content.ReadAsStringAsync().Result;
 }
于 2015-04-03T21:32:07.457 に答える