Почему это исключение утверждает, что код не записывает данные? - PullRequest
3 голосов
/ 09 июля 2011

Если вы запустите этот код, он выдаст исключение 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 ]

5 голосов
/ 01 августа 2011

Проблема заключается в перенаправлении веб-сервером.

К сожалению, вам нужно создать подкласс 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;
  }
}

Если вы хотите пойти дальше, вы можете открыть свойство AllowAutoRedirect в WebClient2 и подключить все это.

2 голосов
/ 09 июля 2011

Как насчет использования этого клиента SkyDrive вместо того, чтобы писать запросы SOAP вручную:

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

Кажется, мне проще.Но если вы действительно настаиваете на использовании WebClient и обрабатываете протокол вручную, вы можете увидеть с помощью Fiddler, что обменивается по проводам с клиентом .NET, и воспроизвести его.Я думаю, что вы можете не предоставить учетные данные для вашего запроса при работе с WebClient для аутентификации.

Если вы посмотрите на трассировку сетевого уровня, вы увидите, что сервер SyDrive требует паспортной аутентификации, которая у вас будетобрабатывать вручную, если вы решите пойти по маршруту 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
1 голос
/ 24 декабря 2015

В моем случае проблема была в том, что перенаправление было выполнено тем же сервером IIS 6, потому что режим состояния сеанса был установлен на «автоопределение» вместо «использовать куки».Каждый URL-запрос был перенаправлен с помощью «AspxAutoDetectCookieSupport = 1».

0 голосов
/ 03 июня 2012

Вы просто должны изменить службу URL на: https://docs.live.net/SkyDocsService.svc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...