2012-10-03 18 views
6

Piszę aplikację Windows 8 (na Visiual Studio 2012), która używa mojej usługi wcf. Działa dobrze, gdy próbuję w moim domu, więc może połączyć się z wcf. Ale gdy próbowałem w moim biurze, nie może połączyć się z WCF i zwraca błąd:"Serwer zdalny zwrócił błąd: (417) Nieudane oczekiwanie."

The remote server returned an error: (417) Expectation Failed.

myślę, że spowodowanie przez zaporę w sieci biurowej .. Googled zbyt dużo, próbował wiele Problem jednak nadal tutaj .

nie działa, ponieważ .Net Framework 4.5 nie ma klasy, lecz ServicePointManager MSDN mówi, że jest ServicePointManager na .NET 4.5 .. http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.expect100continue.aspx

<system.net> 
    <settings> 
     <servicePointManager expect100Continue="false" /> 
    </settings> 
</system.net> 

Nie można spróbować napisać na web.config lub app.config, ponieważ aplikacja win8 nie ma tych plików ..

niektóre osoby napisały powyższy kod do pliku devenv.exe.config VS 2012. Próbowałem, ale nic się nie zmieniło.

http://www.jlpaonline.com/?p=176

+2

Widziałem ten błąd wcześniej, gdy moje połączenia z usługami sieciowymi były blokowane przez proxy – lockstock

Odpowiedz

1

Cóż, pisał pytanie here i Can Bilgin dał odpowiedź. Zamieszczam tutaj dla tych, którzy mają problem niż ty.

I think it should be possible to add the header manually... I would give it a go with the operationscope... from an earlier example:

Task<GetADGroupMemberResponse> AccountManagement.GetADGroupMemberAsync(GetADGroupMemberRequest request) 
{ 
    // CB: Creating the OperationContext 
    using (var scope = new OperationContextScope(this.InnerChannel)) 
    { 
     // CB: Creating and Adding the request header 
     var header = MessageHeader.CreateHeader("Server", "http://schemas.microsoft.com/2008/1/ActiveDirectory/CustomActions", request.Server); 
     OperationContext.Current.OutgoingMessageHeaders.Add(header); 

     return base.Channel.GetADGroupMemberAsync(request); 
    } 
} 

cause on the http requests with the httpclient you can do something like (again from an earlier example):

var httpClient = new HttpClient(); 
var httpContent = new HttpRequestMessage(HttpMethod.Post, "http://app.proceso.com.mx/win8/login"); 

// NOTE: Your server was returning 417 Expectation failed, 
// this is set so the request client doesn't expect 100 and continue. 
httpContent.Headers.ExpectContinue = false; 

var values = new List<KeyValuePair<string, string>>(); 
values.Add(new KeyValuePair<string, string>("user", "******")); 
values.Add(new KeyValuePair<string, string>("pass", "******")); 

httpContent.Content = new FormUrlEncodedContent(values); 

HttpResponseMessage response = await httpClient.SendAsync(httpContent); 

// here is the hash as string 
var result = await response.Content.ReadAsStringAsync(); 
0

Dla odniesienia, co następuje pełne przykładem zastosowania WebClient odpowiedzieć na żądanie JSON usługa odpoczynek. Ustawia flagę Expect100Continue na false, zawiera uwierzytelnianie proxy przy użyciu domyślnych poświadczeń, jeśli jest to wymagane, i przechwytuje kody odpowiedzi innych niż 200.

void Main() 
{ 
    var ms = new MemoryStream(); 
    var ser = new DataContractJsonSerializer(typeof(Job)); 
    ser.WriteObject(ms, new Job { Comments = "Test", Title = "TestTitle", Id = 1 }); 

    var uri = new Uri("http://SomeRestService/Job"); 
    var servicePoint = ServicePointManager.FindServicePoint(uri); 
    servicePoint.Expect100Continue = false; 

    var webClient = new WebClient(); 
    webClient.Headers["Content-type"] = "application/json"; 

    IWebProxy defaultProxy = WebRequest.DefaultWebProxy; 
    if (defaultProxy != null){ 
     defaultProxy.Credentials = CredentialCache.DefaultCredentials; 
     webClient.Proxy = defaultProxy; 
    } 

    try { 
     var result = webClient.UploadData(uri, "POST", ms.ToArray()); 
    } catch (WebException we) { 
     var response = (HttpWebResponse)we.Response; 
    } 
} 

[DataContract] 
public class Job 
{ 
    [DataMember (Name="comments", EmitDefaultValue=false)] 
    public string Comments { get; set; } 
    [DataMember (Name="title", EmitDefaultValue=false)] 
    public string Title { get; set; } 
    [DataMember (Name="id", EmitDefaultValue=false)] 
    public int Id { get; set; } 
} 
0

Chociaż dodanie tej linii
() jako ustawienie do konfiguracji może ustalić początkowy błąd jest prawdopodobne, aby nadal się (504) Bramka Timeout czy ustawienia serwera proxy nie pozwala na użycie poprawna otwórz port otwarty na twoim serwerze docelowym. Aby dodać wyjątek serwera proxy do serwera, do którego wysyłasz, dodaj go za pomocą przeglądarki internetowej jako wykluczenia proxy na karcie Połączenia -> Ustawienia sieci LAN -> Zaawansowane. Mam nadzieję, że będziesz mógł się wtedy połączyć.

Powiązane problemy