C# &引用;远程服务器返回错误:(417)预期失败。”;

C# &引用;远程服务器返回错误:(417)预期失败。”;,c#,.net,wcf,firewall,C#,.net,Wcf,Firewall,我正在编写使用我的wcf服务的Windows8应用程序(在VisiualStudio 2012上)。当我在家尝试时,它运行良好,因此它可以连接到wcf。但当我在办公室尝试时,它无法连接到wcf并返回错误: 远程服务器返回错误:(417)预期失败 我认为这是由办公室网络中的防火墙引起的。。 谷歌搜索太多,尝试了很多,但问题仍然存在 System.Net.ServicePointManager.Expect100Continue = false; 不起作用,因为.Net Framework 4.5

我正在编写使用我的wcf服务的Windows8应用程序(在VisiualStudio 2012上)。当我在家尝试时,它运行良好,因此它可以连接到wcf。但当我在办公室尝试时,它无法连接到wcf并返回错误:

远程服务器返回错误:(417)预期失败

我认为这是由办公室网络中的防火墙引起的。。 谷歌搜索太多,尝试了很多,但问题仍然存在

System.Net.ServicePointManager.Expect100Continue = false;
不起作用,因为.Net Framework 4.5没有ServicePointManager类,但msdn说.Net 4.5上有ServicePointManager。。


无法尝试在web.config或app.config上写入,因为win8应用程序没有这些文件

有些人在VS 2012的devenv.exe.config文件中编写了上述代码。我试过了,但没什么变化


好吧,你发布了问题并给出了答案。 我把它贴在这里是为了那些比你有问题的人

我认为应该可以手动添加标题。。。我会的 用手术镜试一试。。。根据前面的示例:

Task AccountManagement.GetADGroupMemberAsync(GetADGroupMemberRequest)
{
//CB:创建OperationContext
使用(var scope=newoperationContextScope(this.InnerChannel))
{
//CB:创建和添加请求头
var header=MessageHeader.CreateHeader(“服务器”http://schemas.microsoft.com/2008/1/ActiveDirectory/CustomActions“,request.Server);
OperationContext.Current.OutgoingMessageHeaders.Add(header);
返回base.Channel.GetADGroupMemberAsync(请求);
}
}
因为在httpclient的http请求上,您可以做一些事情 类似(同样来自前面的示例):

var-httpClient=new-httpClient();
var httpContent=新的HttpRequestMessage(HttpMethod.Post)http://app.proceso.com.mx/win8/login");
//注意:您的服务器返回417期望值失败,
//这是设置的,因此请求客户端不期望100并继续。
httpContent.Headers.ExpectContinue=false;
var值=新列表();
添加(新的KeyValuePair(“用户”,“*******”));
添加(新的KeyValuePair(“pass”、“*******”));
httpContent.Content=newformurlencodedcontent(值);
HttpResponseMessage response=等待httpClient.SendAsync(httpContent);
//这是作为字符串的散列
var result=await response.Content.ReadAsStringAsync();

以下是使用WebClient向REST webservice发布JSON请求的完整示例,仅供参考。它将
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; }
}

虽然添加了这一行
()
由于配置设置可能会修复初始错误,因此,如果代理设置不允许您使用在目标服务器上打开的正确端口,您可能仍然会获得(504)网关超时。要为要发送到的服务器添加代理例外,请通过internet explorer在“连接”选项卡->LAN设置->高级上添加它作为代理排除。我希望您届时能够连接。

我以前看到过这个错误,当时我的web服务调用被代理阻止
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);
    }
}
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();
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; }
}