问题: (最后的解决方案) 我在Web项目中获得了Silverlight应用程序
网络
Silverlight的
网络包含服务:
[WebService(Namespace = "svChat")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
//[System.Web.Script.Services.ScriptService]
public class GetIPService : System.Web.Services.WebService
{
public GetIPService ()
{
//Uncomment the following line if using designed components
//InitializeComponent();
}
[WebMethod]
public string GetIp()
{
return HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
}
}
我使用服务在我的Silverlight应用程序中获得了一个课程:
public class Client
{
private string ip;
private string created;
#region Properties
public string Ip
{
get { return ip; }
set { ip = value; }
}
public string Created
{
get { return created; }
set { created = value; }
}
#endregion
public Client()
{
}
public void SetIp()
{
ServiceReference1.GetIPServiceSoapClient scIpClient = new svChat.ServiceReference1.GetIPServiceSoapClient();
scIpClient.GetIpCompleted += new EventHandler<svChat.ServiceReference1.GetIpCompletedEventArgs>(IpService_Completed);
scIpClient.GetIpAsync();
}
private void IpService_Completed(object sender, ServiceReference1.GetIpCompletedEventArgs e)
{
this.ip = e.Result;
}
}
创建客户端后,将调用SetIp(),并将Client.Ip添加到文本框中。 什么都没发生。 Ip = null。
服务本身有效,经过测试。 通过上面的代码获得Ip。
通过Silverlight App通过服务获取IP无效。
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="GetIPServiceSoap" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
<security mode="None" />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:2090/svChat.Web/GetIPService.asmx"
binding="basicHttpBinding" bindingConfiguration="GetIPServiceSoap"
contract="ServiceReference1.GetIPServiceSoap" name="GetIPServiceSoap" />
</client>
</system.serviceModel>
</configuration>
有什么想法吗?
的问候,
解决方案: 在VS 2010(Ultimate)中创建Silverlight应用程序会导致VS为Silverlight应用程序和网站使用相同的测试服务器。 在VS使用Silverlight配置设置测试服务器之前,这没有问题。 Silverlight客户端现在无法正确访问Web服务器Web服务。 确切的原因尚不清楚,但我认为这是由上述情况引起的。 所以开始调试,等到网站加载并弹出“异常”,然后“停止”调试,继续测试网站,不用担心异常。 缺点:无需调试。
答案 0 :(得分:1)
我想关键是确认对Web Service的请求确实包含通常由代理服务器或负载均衡器添加的Http头HTTP_X_FORWARDED_FOR
。
如果此标题不存在则调用
的结果HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
是null,这就是你所看到的。由于您在配置点中显示的端点是localhost,因此您肯定不会通过代理或负载均衡器,因此不会添加HTTP_X_FORWARDED_FOR
标头。
的http:// <强>本地主机强>:2090 / svChat.Web / GetIPService.asmx
如果您没有通过代理或负载均衡器,您可以使用REMOTE_ADDR(具有不同程度的成功)
HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]
无论如何,您应该编写代码来处理这些事实,即这些代码实际上都没有任何设置。除非您控制客户端和服务器之间的所有基础设施组件,否则您不能假设每个代理或伙伴平衡器都会添加HTTP_X_FORWARDED_FOR
标头。
更新:根据您提供的代码,以下是我所做的更改。
public MainPage()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(Page_Loaded);
this.MainClient = new Client();
ClientList.Clients.Add(this.MainClient);
// Removed LoadXMLFile call here, constructor runs before Loaded event.
//LoadXMLFile();
}
private void Page_Loaded(object sender, RoutedEventArgs e)
{
svChat.ServiceReference1.GetIPServiceSoapClient scIpClient = new svChat.ServiceReference1.GetIPServiceSoapClient();
scIpClient.GetIpCompleted += new EventHandler<svChat.ServiceReference1.GetIpCompletedEventArgs>(IpService_Completed);
scIpClient.GetIpAsync();
}
public void IpService_Completed(object sender, svChat.ServiceReference1.GetIpCompletedEventArgs e)
{
this.MainClient.Ip = e.Result;
// Probably where you should call LoadXMLFile
// at this point the async call has returned and
// the ip is intitialized.
LoadXMLFile();
}