3

このコードを実行すると、WebException がスローされます。内部例外は、「データを書き込まない操作には Content-Length または Chunked Encoding を設定できません」です。そして私は問題の性質を理解していません。誰もこの暗い隅に光を当てることができますか?

using System.Diagnostics;
using System.Net;
using System.Text;

namespace sandpit
{
  static class Program
  {
    static void Main()
    {
      string INITIAL_URI = "http://docs.live.net/SkyDocsService.svc";
      string SOAP = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body><GetWebAccountInfoRequest xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://schemas.microsoft.com/clouddocuments\"><BaseRequest><ClientAppId>SkyDrive Service Client</ClientAppId><Market>en-US</Market><SkyDocsServiceVersion>v1.0</SkyDocsServiceVersion></BaseRequest><GetReadWriteLibrariesOnly>false</GetReadWriteLibrariesOnly></GetWebAccountInfoRequest></s:Body></s:Envelope>";
      using (WebClient wc = new WebClient())
      {
        wc.Encoding = Encoding.UTF8;
        wc.Headers["SOAPAction"] = "GetWebAccountInfo";
        wc.Headers["Accept-Language"] = "en-US";
        wc.Headers["Accept"] = "text/xml";
        wc.Headers["Content-Type"] = "text/xml; charset=utf-8";
        string response = wc.UploadString(INITIAL_URI, SOAP);
        Debug.WriteLine(response);
      }
    }
  }
}
4

4 に答える 4

5

問題は、Web サーバーによるリダイレクトです。

残念ながら、これを修正するには WebClient をサブクラス化する必要があります。これは見た目よりも難しいことです。Silverlight (あらゆるフレーバー) はこれを好まず、ctor をオーバーライドして SecurityCritical として属性を付ける必要があると推測するまで、継承関連の例外をスローします。

public class WebClient2 : WebClient
{
  [SecurityCritical]
  public WebClient2() : base() { }  
  protected override WebRequest GetWebRequest(System.Uri address)
  {
    var wr = base.GetWebRequest(address);
    if (wr is HttpWebRequest)
      (wr as HttpWebRequest).AllowAutoRedirect = false;
    return wr;
  }
}

さらに先に進みたい場合は、WebClient2 で AllowAutoRedirect プロパティを表示し、すべてを接続できます。

于 2011-08-01T01:42:11.783 に答える
2

SOAP リクエストを手動で記述する代わりに、このSkyDrive クライアントを使用するのはどうでしょうか。

var client = new SkyDriveServiceClient();
client.LogOn("user", "pwd");
var info = client.GetWebAccountInfo();
Console.WriteLine(info.Title);

私には簡単に思えます。しかし、プロトコルを手動で処理することを強く主張する場合WebClientは、Fiddler を使用して、.NET クライアントとの間でネットワーク経由で交換されているものを確認し、複製することができます。認証のために WebClient を操作するときに、リクエストに資格情報を提供できない可能性があると思います。

ネットワーク レベルのトレースを見ると、SyDrive サーバーには Passport 認証が必要であることがわかります。このWebClientルートを使用する場合は、手動で処理する必要があります。

Location: https://login.live.com/login.srf?wa=wsignin1.0&rpsnv=11&ct=1310230173&rver=6.1.6206.0&wp=MBI&wreply=http:%2F%2Fdocs.live.net:101%2FSkyDocsService.svc&lc=1033&id=250206
WWW-Authenticate: Passport1.4 ct=1310230292,rver=6.1.6206.0,wp=MBI,lc=1033,id=250206
于 2011-07-09T16:37:54.523 に答える
-1

URL サービスをhttps://docs.live.net/SkyDocsService.svcに変更するだけです。

于 2012-06-03T14:01:57.560 に答える