C# &引用;远程服务器返回错误:(417)预期失败。”;
我正在编写使用我的wcf服务的Windows8应用程序(在VisiualStudio 2012上)。当我在家尝试时,它运行良好,因此它可以连接到wcf。但当我在办公室尝试时,它无法连接到wcf并返回错误: 远程服务器返回错误:(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
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; }
}