2012-10-03 14 views
6

Ich schreibe Windows 8 App. (Auf Visiual Studio 2012), die meinen WCF-Dienst verwendet. Es funktioniert gut, wenn ich es bei mir zuhause versuche, damit es sich mit dem WCF verbinden kann. Aber wenn ich in meinem Büro versuchte, kann es nicht zu wcf verbindet und gibt Fehler:"Der Remote-Server hat einen Fehler zurückgegeben: (417) Erwartung fehlgeschlagen."

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

Ich denke, die durch eine Firewall im Büro Netz verursacht .. zu viel gegoogelt, versuchten viel aber das Problem ist immer noch hier .

funktioniert nicht, da .Net Framework 4.5 hat nicht Servicepoint Klasse aber Msdn sagt, es gebe Servicepoint auf .Net 4.5 .. http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.expect100continue.aspx

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

kann nicht versuchen, dies auf web.config zu schreiben oder app.config, weil win8 app hat diese dateien nicht ..

einige leute schrieb obigen code zu devenv.exe.config-datei von VS 2012. Ich habe es versucht, aber nichts geändert.

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

+2

Ich habe diesen Fehler zuvor gesehen, als meine Web-Service-Anrufe von einem Proxy blockiert wurden – lockstock

Antwort

1

Nun, geschrieben Sie die Frage here und Can Bilgin gab eine Antwort. Ich poste es hier für diejenigen, die das Problem haben, als Sie.

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

Zur Referenz ist das Folgende ein vollständiges Beispiel der Verwendung eines WebClient JSON Anforderung an einen REST Webservice zu schreiben. Es setzt das Flag Expect100Continue auf false, enthält Proxyauthentifizierung mit Standardanmeldeinformationen, falls erforderlich, und fängt Nicht-200-Antwortcodes ab.

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

Obwohl das Hinzufügen dieser Zeile
() als Einstellung der Config den anfänglichen Fehler beheben können Sie wahrscheinlich noch bekommen (504) Gateway-Timeout, wenn Sie Ihre Proxy-Einstellungen nicht erlauben Sie den richtigen verwenden Öffnen Sie den Port, der für Sie auf dem Zielserver geöffnet ist. Um eine Proxy-Ausnahme für den Server hinzuzufügen, an den Sie senden, fügen Sie ihn über den Internet Explorer als Proxy-Ausschluss auf der Registerkarte Verbindungen -> LAN-Einstellungen -> Erweitert hinzu. Ich hoffe, du kannst dich dann verbinden.

Verwandte Themen