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 .. 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 应用程序没有这些文件..

有些人将上述代码写入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) 网关超时。要为您发送到的服务器添加代理例外,请通过 Internet Explorer 将其添加为连接选项卡上的代理排除 -> LAN 设置 -> 高级。我希望你能连接到那时。

于 2014-11-25T13:58:52.540 回答