WebServices不与App交互

时间:2010-05-19 18:55:55

标签: c# .net silverlight web-services asmx

问题: (最后的解决方案) 我在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服务。 确切的原因尚不清楚,但我认为这是由上述情况引起的。 所以开始调试,等到网站加载并弹出“异常”,然后“停止”调试,继续测试网站,不用担心异常。 缺点:无需调试。

1 个答案:

答案 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();
    }