6

私の wcf サービスを使用する Windows 8 アプリ (Visiual Studio 2012) を作成しています。自宅で試してみるとうまく動作するので、wcfに接続できます。しかし、オフィスで試したところ、wcf に接続できず、エラーが返されました。

リモート サーバーがエラーを返しました: (417) 期待に失敗しました。

オフィス ネットワークのファイアウォールが原因だと思います。

System.Net.ServicePointManager.Expect100Continue = false;

.Net Framework 4.5 には ServicePointManager クラスがありませんが、msdn は .Net 4.5 に ServicePointManager があると言っているため、機能しません

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

win8アプリにはこれらのファイルがないため、これをweb.configまたはapp.configに書き込むことはできません..

VS 2012 の devenv.exe.config ファイルに上記のコードを書いた人がいます。試してみましたが、何も変わりませんでした。

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

4

3 に答える 3

1

さて、あなたはここに質問を投稿し、Can Bilginが答えました。あなたよりも問題を抱えている人のためにここに投稿します。

ヘッダーを手動で追加することは可能だと思います...以前の例から:

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);
    }
}

httpclient を使用した http リクエストでは、次のようなことができます (これも前の例から):

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();
于 2012-11-15T08:35:53.820 に答える
0

参考までに、WebClient を使用して JSON 要求を REST 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; }
}
于 2014-03-11T23:11:00.043 に答える
0

この行
() を構成に設定として追加すると、最初のエラーが修正される可能性がありますが、プロキシ設定で、ターゲット サーバーで開いている正しいポートを使用できない場合は、(504) Gateway Timeout が発生する可能性があります。送信先のサーバーにプロキシの例外を追加するには、インターネット エクスプローラーを使用して、[接続] タブ -> [LAN 設定] -> [詳細設定] でプロキシの除外として追加します。その時はご連絡いただければと思います。

于 2014-11-25T13:58:52.540 に答える