2012-10-03 36 views
6

私はwcfサービスを使用するwindows 8 app。(Visiual Studio 2012)を書いています。それは私の家で試してみるとうまくいくので、wcfに接続できます。しかし、私は私のオフィスにしようとしたとき、それはWCFに接続することができず、エラーを返し:"リモートサーバーからエラーが返されました:(417)Expectation Failed。"

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

私はそのオフィスのネットワークでファイアウォールによって原因だと思う。.. があまりにも多くのGoogleで、まだここが問題の多くを試してみました。

の.NET Framework 4.5がServicePointManagerクラスが、MSDNは純4.5上ServicePointManagerがあると言うていないため動作しません。.. http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.expect100continue.aspx

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

は、web.configファイルに書き込むためにこれをしようとすることはできませんまたはapp.configはwin8 appにこれらのファイルがないためです。

上記のコードをVS 2012のdevenv.exe.configファイルに書き込んだ人もいますが、変更はありません。

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

+2

私のWebサービスコールがプロキシによってブロックされていたときにこのエラーが発生しました – lockstock

答えて

1

さて、あなたは質問hereを掲示し、Can Bilginは答えを与えました。 あなたよりも問題のある人のためにここに投稿します。参考

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

、以下のRESTのWebサービスにJSON要求を投稿するWebクライアントを使用しての完全な例です。 Expect100Continueフラグをfalseに設定し、必要に応じてデフォルトの認証情報を使用してプロキシ認証を行い、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

コンフィグに設定としてこのライン
() を追加すると、あなたはまだ取得する可能性があり、最初のエラーを修正するかもしれないが(504)ゲートウェイタイムアウトがあなたのプロキシ設定が正しいを使用できるようにされていない場合開いているポートをターゲットサーバー上で開いてください。送信するサーバーにプロキシ例外を追加するには、[接続]タブ - > [LAN設定] - > [詳細設定]のプロキシ除外としてInternet Explorer経由で追加します。私はあなたが接続できるようになることを願っています。

関連する問題