手动配置WCF宿主的.config文件遇到的几种错误

132 篇文章 0 订阅
手动配置WCF宿主的.config文件遇到的几种错误  
今天尝试用控制台应用程序作为WCF宿主,遇到几个问题,这几个问题虽然都不难,但寻找解决方案相当费时费力,做记录。 
 
WCF标准的配置文件为:
 
<system.serviceModel>
        <services>
            <service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior">
                <!-- Service Endpoints -->
        <!-- This endpoint is exposed at the base address provided by the host : http://localhost:1808/Service.svc-->
                <endpoint address="" binding="wsHttpBinding" contract="Microsoft.ServiceModel.Samples.ICalculator">
                    <!-- 
              部署时,应删除或替换下列标识元素,以反映
              在其下运行部署服务的标识。删除之后,WCF 将
              自动推导相应标识。
          -->
                    <identity>
                        <dns value="localhost"/>
                    </identity>
                </endpoint>
        <!-- This mex endpoint is exposed at the base address provided by the host : http://localhost:1808/Service.svc/mex-->
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="CalculatorServiceBehavior">
                    <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点-->
                    <serviceMetadata httpGetEnabled="true"/>
                    <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息-->
                    <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>
 
 
 
遇到问题:
 
1.“服务XXXXX有零个应用程序(非基础结构)终结点”。
 
  这是因为<service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior">的name属性没有对应到正确的名称。 
 
在上面的例子中使用的是Microsoft.ServiceModel.Samples命名空间下的CalculatorService类,如果命名空间命或类名写错,或者写的不完全(比如只写了命名空间名字或者类名),则会出现上述错误。
 
2.WCF服务发布以后,Client 端无法引用WCF服务,查看错误为“application soap+xml charset utf-8 客户端和服务绑定可能不匹配”。或者使用IE访问WCF服务地址的时候显示“当前已禁用此服务元数据的发布”。
 
  按着《ASP.NET 3.5高级程序设计(第4版)》中的WCF案例一步步进行,书上说为了使初学者更好的关注WCF细节,先不使用WCF模版,但是进行到最后报出上述错误。书上写的配置是不包含<behaviors>节点的,这时Client 端无法正常连接服务,于是在网上各种找解决方法,在http://www.cnblogs.com/lanpei/archive/2009/10/29/1592218.html上找到累死问题解决方法,于是加上<behaviors>节点,此时仍然会报相同错误。因为书上的例子中没有<behaviors>节点,所以<service>节点中也不包含behaviorConfiguration属性,设置好behaviorConfiguration="CalculatorServiceBehavior",彻底没问题了。
 
 3.使用NetTcpBinding绑定WCF服务,Client端引无法引用WCF服务,查看错误为“元数据包含无法解析的引用”。
 
  刚开始加了各种节点都不好使,后来查MSDN,下载了一个NetTcpBinding的案例仔细对比才发现是<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>中的contract="IMetadataExchange"写错了,本以为这个属性应该与<endpoint address="" binding="wsHttpBinding" contract="Microsoft.ServiceModel.Samples.ICalculator">中的contract相同,后来发现理解错误,在使用http绑定的时候写错好像无所谓,但是使用NetTcpBinding的时候,必须是IMetadataExchange,暂时还不太理解为什么。
 
 4.使用NetTcpBinding绑定WCF服务,本机Client 端可以正常访问,但跨机器访问时提示错误“net.tcp://XXXXXX不支持请求的升级。这可能是由于不匹配的绑定”。
 
  这个问题很困扰,Google上查“不支持请求的升级”居然没有任何相关线索,后来忘了怎么找到解决办法的。该问题是因为服务端和客户端的安全设置不一致,也就是<security mode=""/>节点中的mode值不一致,设置成一致的(比如None,Transport)就没问题了。
 
 
 
个人觉得,的确像书上说的那样,不使用模板会关注WCF的一些细节,可以更好的理解WCF,之前直接用WCF模板做成类似WebService的服务,然后部署到IIS上,觉得很简单,根本没想过改变宿主或者安全性之类的问题。最近重新学习WCF才发现,要注意的东西还挺多。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WCF 中接收 `uni.uploadFile` 文件,你可以按照以下步骤进行操作: 1. 首先,在 WCF 服务的契约中定义一个操作合同,用于接收文件。例如: ```csharp [ServiceContract] public interface IFileService { [OperationContract] void UploadFile(Stream fileData); } ``` 2. 在服务实现类中,实现该操作合同。在方法中,你可以使用 `Stream` 类型的参数接收文件数据。例如: ```csharp public class FileService : IFileService { public void UploadFile(Stream fileData) { // 处理文件数据 // 可以使用流操作、保存到磁盘、或者进行其他自定义操作 } } ``` 3. 在服务的配置文件中,配置绑定和终结点。你可以使用基于 HTTP 的绑定,如 `basicHttpBinding` 或 `webHttpBinding`。例如: ```xml <system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IFileService" /> </basicHttpBinding> </bindings> <services> <service name="YourNamespace.FileService"> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IFileService" contract="YourNamespace.IFileService" /> </service> </services> </system.serviceModel> ``` 4. 在客户端调用代码中,引用服务契约并创建代理对象。然后,可以使用代理对象调用 `UploadFile` 方法并传递文件数据。例如: ```csharp using (var client = new FileServiceClient()) { using (var fileStream = File.OpenRead("path/to/file")) { client.UploadFile(fileStream); } } ``` 这样,你就可以在 WCF 中成功接收 `uni.uploadFile` 的文件数据。记得根据实际需求进行适当的异常处理和文件操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值