如何使用两个wsdl并使用C#应用程序维护一个测试实例?

如何使用两个wsdl并使用C#应用程序维护一个测试实例?,c#,testing,wsdl,salesforce,C#,Testing,Wsdl,Salesforce,我已经创建了一个服务,使用其WSDL通过C#与SalesForce平台进行通信。碰巧SalesForce(逻辑上)允许其平台的“沙盒”实例和其平台的“生产”实例。我的应用程序设计用于生产环境,但我一直在使用沙箱进行集成测试和单元测试。我现在已经到了需要部署到生产环境的地步。然而,我面临一个大问题,如果我需要构建和测试新功能,我必须将WSDL从生产实例更新到沙盒实例,然后在添加新功能时来回交换。这是因为这两个wsdl完全不同,我必须从它们生成代码!这不仅草率,而且危险。我可能会影响一些实时系统数据

我已经创建了一个服务,使用其WSDL通过C#与SalesForce平台进行通信。碰巧SalesForce(逻辑上)允许其平台的“沙盒”实例和其平台的“生产”实例。我的应用程序设计用于生产环境,但我一直在使用沙箱进行集成测试和单元测试。我现在已经到了需要部署到生产环境的地步。然而,我面临一个大问题,如果我需要构建和测试新功能,我必须将WSDL从生产实例更新到沙盒实例,然后在添加新功能时来回交换。这是因为这两个wsdl完全不同,我必须从它们生成代码!这不仅草率,而且危险。我可能会影响一些实时系统数据


我想找到一种方法来使用注册表项、文本值或一些配置设置来告诉我的应用程序要使用哪个WSDL。麻烦是什么?我不知道怎么才能做到这一点。我的代码引用的对象就是从该WSDL生成的。有什么想法吗?

WSDLs不应该与两者完全不同!当然,除非在沙箱中创建了大量新对象和自定义字段,但尚未推送到生产环境中

您是否有可能混合了企业(强类型版本)和合作伙伴(更通用的)WSDL?有关详细信息,请查看此帮助主题:

如果您真的关心数据模型,您可能会决定使用合作伙伴版本(生成的代码有点难看,因为它为您提供了通用的对象,而不是更具体的帐户、联系人等)。我对企业版总是很满意(沙盒中的东西最终进入了生产,一旦不同的系统开始依赖数据模型,团队就开始同步他们的发布,如果可能的话)


区分对我有效的端点的方法是检查端点(在文件的最底部)。我在做PHP集成,所以对我来说,动态翻转端点不是问题,而是“信任”相同的对象结构。不知道在C#world中会是什么样子,这段信息在解析代码中会出现在哪里。。。祝你好运

企业-沙箱

<service name="SforceService">
<documentation>Sforce SOAP API</documentation>
<port binding="tns:SoapBinding" name="Soap">
    <soap:address location="https://test.salesforce.com/services/Soap/c/26.0/(18 char sandbox Id)"/>
</port>
</service>
合作伙伴WSDL的URL中有“u”而不是“c”,并且它们不带有特定组织的id:
https://test.salesforce.com/services/Soap/u/26.0“/

(我记住这一点的小技巧是将其视为“客户机”或“定制”和“通用”)

编辑:
当然,如果你坚持“企业号”“您真正可以信赖的唯一端点是生产。沙盒组织ID在每次刷新时都会更改。

在任何可访问对象中都没有版本信息可以告诉您所处的环境吗?您使用的是WCF还是老式的web代理?这是一个非常好的开始!我猜我能做的就是在我的应用程序中放入一个表示“生产”或“沙盒”的配置文件。然后,我可以将WSDL文件添加为输出的一部分,然后将WSDL文件与配置文件进行比较,并仅在两者匹配时进行连接。还有更好的方法吗?好吧,我最后让用户决定他想在哪里登录(他的密码可能不同,您需要在login()调用中选择端点)。配置听起来比硬编码好一步:P表示完全的灵活性-伙伴WSDL和dynamic Descripte()类调用(速度较慢,但还有其他好处,例如,如果当前登录的用户看不到某些特殊字段,则Descripte不会返回)。为了更容易地编写C#代码-企业版。。。您还可以“优雅地失败”——enterprise是partner的超集,因此您也可以使用这些通用方法。
https://login.salesforce.com/services/Soap/c/26.0/(prod id)