关于asp.net:Visual Studio basicHttpBinding 和端点问题

关于asp.net:Visual Studio basicHttpBinding 和端点问题

Visual Studio basicHttpBinding and endpoint problems

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

不幸的是,这意味着当我更新项目中的服务引用时,我们最终会遇到一团糟——多个绑定和端点。 Visual Studio 使用数字后缀(即"Service1"作为"Service1"的副本)创建新的绑定和端点,导致配置无效,因为项目中的每个服务引用可能只有一个绑定。

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

目前我们正在通过在更新引用后简单地撤消 app.config 上的结帐来解决此问题,但我不禁认为必须有更好的方法!

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

1
2
3
security mode="TransportCredentialOnly"
    transport clientCredentialType="Ntlm" /
/security

和:

1
binding maxBufferSize="655360" maxReceivedMessageSize="655360" /

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


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


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

该批次随后可用于自动构建。然后您只需要设置一次 app.config(或 web.config)。我们一般将不同环境的不同配置分开,例如 dev、test prod。

示例(注意换行符):

1
2
3
4
5
6
7
8
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 实用程序自动生成的 app.config 和 *.cs 文件,然后我们运行一个运行 svcutil.exe 的批处理文件来检索服务元数据.完成后,我们重新编译代码,确保它正常工作,然后重新检查更新的 app.config 和 *.cs 文件。这比使用经常出错的"添加服务"可靠得多使用 Visual Studio 引用"。


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

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

无论如何感谢您的建议。


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


推荐阅读