2

我在 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" />

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

4

5 回答 5

2

创建一个使用 svcutil 的 .Bat 文件,用于代理生成,该文件具有适合您项目的设置。这很容易。单击 batfile,每当界面更改时生成新的代理文件很容易。

该批次随后可用于自动构建。然后您只需要设置一次 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

于 2008-09-16T05:47:35.070 回答
2

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

于 2008-09-16T14:49:24.393 回答
0

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

于 2008-09-16T03:24:35.973 回答
0

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

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

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

于 2008-09-16T05:15:15.443 回答
0

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

于 2008-09-17T06:27:32.140 回答