在尝试访问WCF REST服务时,我遇到了一些iPhone模拟器的问题。 我在Xamarin论坛上问过这个问题,但没有快乐。
某些背景信息:
测试时
问题是,一旦我尝试通过iPhone模拟器上的应用程序访问该服务,我就会收到407,代理访问被拒绝错误。
以下是我用来设置连接的代码:
private static HttpRequestMessage PrepareRequestMessage(HttpMethod method, string baseUri,
string queryParameters, out HttpClient httpClient, string bodyContent)
{
var finalUri = new Uri(baseUri + queryParameters);
var handler = new HttpClientHandler();
httpClient = new HttpClient(handler);
var requestMessage = new HttpRequestMessage(method, finalUri);
if (handler.SupportsTransferEncodingChunked())
{
requestMessage.Headers.TransferEncodingChunked = true;
}
if (method == HttpMethod.Post || method == HttpMethod.Put)
{
requestMessage.Content =
new StringContent(bodyContent, Encoding.UTF8, "application/json");
}
return requestMessage;
}
该代码给出了407错误。
我尝试使用SupportsProxy和SupportsUseProxy的各种组合来设置代理。 (两者都从模拟器返回false。) 我试过强制代理设置无论如何。我已经尝试在处理程序本身上设置凭据。我试过玩UseDefaultCredentials和UseProxy标志。我也尝试在邮件头中设置IfModifiedSince值。我也尝试过使用PortableRest包。
所有这些似乎只会让事情变得更糟。我最初得到407错误的地方,对httpClient.GetAsync的调用只会立即返回null。
我在这里有点不知所措,所以任何帮助都会非常感激。
PS。为了完整起见,进行调用的周围代码的其余部分:(请原谅蹩脚的异常处理,我仍在玩错误)
public static async Task<T> SendRESTMessage<T>(HttpMethod method, string baseUri,
string queryParameters, T contentObject)
{
HttpClient httpClient;
var payload = string.Empty;
if (contentObject != null)
{
payload = JsonConvert.SerializeObject(contentObject);
}
var requestMessage =
PrepareRequestMessage(method, baseUri, queryParameters, out httpClient, payload);
HttpResponseMessage responseMessage = null;
try
{
if (method == HttpMethod.Get)
{
responseMessage = await httpClient.GetAsync(requestMessage.RequestUri);
}
else
{
responseMessage = await httpClient.SendAsync(requestMessage);
}
}
catch (HttpRequestException exc)
{
var innerException = exc.InnerException as WebException;
if (innerException != null)
{
throw new Exception("Unable to connect to remote server.");
}
}
return await HandleResponse<T>(responseMessage);
}
private static async Task<T> HandleResponse<T>(HttpResponseMessage responseMessage)
{
if (responseMessage != null)
{
if (!responseMessage.IsSuccessStatusCode)
{
throw new Exception("Request was unsuccessful");
}
var jsonString = await responseMessage.Content.ReadAsStringAsync();
var responseObject = JsonConvert.DeserializeObject<T>(jsonString);
return responseObject;
}
return default(T);
}
这是我尝试快速而肮脏地实施IWebProxy,我认为这可能会让事情变得更糟:
public class MyProxy : IWebProxy
{
private System.Net.ICredentials creds;
public ICredentials Credentials
{
get
{
return creds;
}
set
{
creds = value;
}
}
public Uri GetProxy(Uri destination)
{
return new Uri("proxy addy here");
}
public bool IsBypassed(Uri host)
{
return true;
}
}
再次感谢您花时间阅读我的问题。
答案 0 :(得分:2)
所以我终于明白了。
原来这是非常愚蠢的事情,但对iOS移动开发者来说是新手,而且这个服务在模拟器上通过Safari工作的事实让我陷入了困境。
我读到模拟器使用Mac上定义的代理设置。所以我进入网络设置并将服务地址添加到代理绕过列表。
现在就像魅力一样。
如果有人认为有更好的方法,请添加您的意见。