2013-09-23 54 views
1

我在写一个应用程序,它使用SOAP服务来发送数据。用户可以在应用程序设置中更改URL端点。C#Web参考 - 动态URL错误

这是我做的:

public HubHandler() 
{ 
    this.urlHub = Settings.Default.UrlWebService; 
    //some code 
    this.connect(); 
} 


private void connect() 
{ 
    this.service = new HubService(); 
    this.service.Proxy = System.Net.HttpWebRequest.GetSystemWebProxy(); 
    this.service.Proxy.Credentials = CredentialCache.DefaultCredentials; 
    this.service.Url = this.urlHub; 
} 

其实我只是改变了服务的URL属性,从我读它必须有足够的做我想做的。

当用户配置的url与我默认放在web引用属性中的url相同时,一切正常。但是,当用户输入自己的网址,一个例外是只要服务方法称为抛出(在这里验证):

Unable to cast object of type 'System.Xml.XmlNode[]' to type 'HubServiceAuthenticateOut' 

There is an error in XML document (2, 649) 

我捕捉使用Wireshark数据包,相比这两种情况:内容完全相同,只是名称空间随url更改。 XML是完全正确的(服务器端,它是一个PHP应用程序,用于生成wsdl和处理调用的zend soap autodiscover)。

有没有人已经遇到过这种问题?有没有更好的方法来改变服务端点比url属性?

当我看着我的Reference.cs,我看到的命名空间硬编码,这样的:

[System.Web.Services.WebServiceBindingAttribute(Name="HubServiceBinding", Namespace="https://localhost/myapp/HubService.php")] 

即使url属性是动态的,可以把它扯上关系?

谢谢!

回答

0

最后似乎不可能做到我想要的。问题是框​​架分析web服务响应并检查名称空间。

看一看这个帖子:Webservice fails to cast type using dynamic URL: There is an error in XML document (2, 691)

我们可以定义三种情况:

  1. 只有一个终点,没有问题
  2. 端点的数量有限:每个域1个Web引用。阅读这个有趣的答案,就如何以编程方式管理这个问题给出一个好主意:https://stackoverflow.com/a/18322644/2806497
  3. 无限数量的终结点:无法通过visual studio webreferences处理它。