我在 VS 2008 中有一个 WPF 应用程序,其中包含一些 Web 服务引用。由于各种原因(最大消息大小、身份验证方法),我需要在 WPF 客户端的 app.config 中手动定义服务绑定的许多设置。

不幸的是,这意味着当我更新项目中的服务引用时,我们最终会陷入混乱 - 多个绑定和端点。Visual Studio 创建带有数字后缀的新绑定和终结点(即“Service1”作为“Service”的重复项),导致配置无效,因为项目中的每个服务引用可能只有一个绑定。

这很容易复制 - 只需在解决方案中创建一个简单的“Hello World”ASP.Net Web 服务和 WPF 应用程序,更改 app.config 绑定中的 maxBufferSize 和 maxReceivedMessageSize,然后更新服务引用。

目前,我们正在解决这个问题,方法是在更新引用后简单地撤消对 app.config 的签出,但我忍不住认为一定有更好的方法!

另外,我们需要手动更改的设置有:

<security mode="TransportCredentialOnly">
    <transport clientCredentialType="Ntlm" />
</security>

和:

<binding maxBufferSize="655360" maxReceivedMessageSize="655360" />

我们使用服务工厂类,因此如果这些设置能够以某种方式以编程方式设置,则可以工作,尽管属性似乎没有公开。

有帮助吗?

解决方案

创建一个使用 svcutil 进行代理生成的 .Bat 文件,该文件具有适合您的项目的设置。这相当容易。每当界面发生更改时,单击bat文件即可轻松生成新的代理文件。

该批处理随后可以用于自动构建。那么你只需要设置一次app.config(或web.config)。我们一般会针对不同的环境分开不同的配置,比如dev、test prod。

示例(注意换行符):

REM generate meta data
call "SVCUTIL.EXE" /t:metadata "MyProject.dll" /reference:"MyReference.dll"

REM making sure the file is writable
attrib -r "MyServiceProxy.cs"

REM create new proxy file
call "SVCUTIL.EXE" /t:code *.wsdl *.xsd /serializable /serializer:Auto /collectionType:System.Collections.Generic.List`1  /out:"MyServiceProxy.cs" /namespace:*,MY.Name.Space /reference:"MyReference.dll" 

:)

//W

其他提示

您可以添加第二个端点并使用您需要的配置进行绑定定义,而不是更改生成的端点,然后在代码中只需将新端点的名称放入服务客户端构造函数中。

不知何故,我更喜欢直接使用 svcutil.exe,而不是使用 Visual Studio 的“添加服务引用”功能:P 这就是我们在 WCF 项目中所做的事情。

我同意您的观点,svcutil 绝对是添加和更新服务引用的更高级方法。当“右键单击,更新参考”非常接近于一步工作时,它只是需要更多的手动工作。

我想我们可以创建一些批处理文件或其他文件来输出参考代码。即使如此,使用 svcutil 手动签出和更新服务代码可能比仅撤消配置签出需要更多工作。

无论如何,感谢您的建议。

我们所做的是(从源代码管理中)签出 svcutil.exe 实用程序自动生成的 app.config 和 *.cs 文件,然后运行一个批处理文件来检索服务元数据。完成后,我们重新编译代码,确保其有效,然后重新检查更新的 app.config 和 *.cs 文件。它比在 Visual Studio 中使用经常出现错误的“添加服务引用”要可靠得多。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top