Jim*_*mmy 12 wcf iis-7 iis-manager
我一直在尝试按照本教程将WCF示例部署到IIS.我无法让它发挥作用.这是一个托管站点,但我确实有IIS管理员访问服务器.但是,在本教程的第2步中,我无法"创建一个物理上位于此应用程序目录中的新IIS应用程序".我似乎无法找到菜单项,上下文菜单项或什么不创建新的应用程序.我一直在疯狂地点击所有地方,仍然无法弄清楚如何创建一个新的应用程序.我想这可能是根本问题,但我尝试了其他一些事情(如下所述)以防万一实际上不是问题.这是我在IIS管理器中看到的图片,以防我的话不公正:
没有添加应用程序在这里http://www.freeimagehosting.net/uploads/d6edbaaf3c.png
这是在http://test.com.cws1.my-hosting-panel.com/IISHostedCalcService/Service.svc上 "部署"的.错误说:
The type 'Microsoft.ServiceModel.Samples.CalculatorService',
provided as the Service attribute value in the ServiceHost directive,
or provided in the configuration element
system.serviceModel/serviceHostingEnvironment/serviceActivations
could not be found.
Run Code Online (Sandbox Code Playgroud)
我还尝试在dotnetpanel中创建一个指向IISHostedCalcService的虚拟目录(IISHostedCalc).当我导航到http://test.com.cws1.my-hosting-panel.com/IISHostedCalc/Service.svc时,会出现另一个错误:
This collection already contains an address with scheme http.
There can be at most one address per scheme in this collection.
Run Code Online (Sandbox Code Playgroud)
有趣的是,如果我点击查看应用程序,似乎虚拟目录是一个应用程序(见下图)...虽然,根据上面的错误消息,它不起作用.
这是一个应用程序?http://www.freeimagehosting.net/uploads/f3230be046.png
根据教程,没有涉及编译; 我刚刚将文件放在服务器上,如下面的文件夹IISHostedCalcService:
service.svc
Web.config
<dir: App_Code>
Service.cs
Run Code Online (Sandbox Code Playgroud)
service.svc包含:
<%@ServiceHost language=c# Debug="true" Service="Microsoft.ServiceModel.Samples.CalculatorService"%>
Run Code Online (Sandbox Code Playgroud)
(我尝试使用c#属性的引号,因为这看起来有点奇怪没有引号,但它没有区别)
Web.config包含:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="Microsoft.ServiceModel.Samples.CalculatorService">
<!-- This endpoint is exposed at the base address provided by host: http://localhost/servicemodelsamples/service.svc -->
<endpoint address=""
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
<!-- The mex endpoint is explosed at http://localhost/servicemodelsamples/service.svc/mex -->
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
<system.web>
<customErrors mode="Off"/>
</system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)
Service.cs包含:
using System;
using System.ServiceModel;
namespace Microsoft.ServiceModel.Samples
{
[ServiceContract]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
[OperationContract]
double Subtract(double n1, double n2);
[OperationContract]
double Multiply(double n1, double n2);
[OperationContract]
double Divide(double n1, double n2);
}
public class CalculatorService : ICalculator
{
public double Add(double n1, double n2)
{
return n1 + n2;
}
public double Subtract(double n1, double n2)
{
return n1 - n2;
}
public double Multiply(double n1, double n2)
{
return n1 * n2;
}
public double Divide(double n1, double n2)
{
return n1 / n2;
}
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,似乎我得到了这个工作.我仍然无法在IIS管理器中找到"创建应用程序"项.那部分是令人沮丧的,但我很高兴它似乎仍在工作.
我在wwwroot下创建了物理目录IISHostedCalcService.这造成了一些混乱; 这意味着http://test.com.cws1.my-hosting-panel.com/IISHostedCalcService/Service.svc几乎正常工作,但它不应该.我将IISHostedCalcService移到了wwwroot之外,现在访问该服务的唯一地方是http://test.com.cws1.my-hosting-panel.com/IISHostedCalc/Service.svc.
然后,访问http://test.com.cws1.my-hosting-panel.com/IISHostedCalc/Service.svc抛出"此集合已包含带有方案http的地址.
每个方案最多可以有一个地址这个系列." 错误.事实证明,解决方案是将以下内容添加到web.config文件中,就在system.serviceModel下:
<serviceHostingEnvironment>
<baseAddressPrefixFilters>
<add prefix="http://test.com.cws1.my-hosting-panel.com"/>
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
Run Code Online (Sandbox Code Playgroud)
在此之后,我在访问http://test.com.cws1.my-hosting-panel.com/IISHostedCalc/Service.svc时遇到了一个新错误:"在合同列表中找不到合同名称IMetadataExchange服务CalculatorService".事实证明,解决方案是修改web.config文件,如下所示(即,在service元素中添加behavior部分和behaviorConfiguration ="SimpleServiceBehavior"):
<configuration>
<system.serviceModel>
<serviceHostingEnvironment>
<baseAddressPrefixFilters>
<add prefix="http://test.com.cws1.my-hosting-panel.com"/>
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
<services>
<service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="SimpleServiceBehavior">
...
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="SimpleServiceBehavior">
<serviceMetadata httpGetEnabled="True" policyVersion="Policy15" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
<system.web>
<customErrors mode="Off"/>
</system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)
最后,我能够通过http:// msdn教程的步骤5c中的http://test.com.cws1.my-hosting-panel.com/IISHostedCalc/service.svc?wsdl指向svcutil来创建客户端代理..microsoft.com/zh-CN/library/ms733133.aspx.但是,当我运行客户端时,我得到了"调用者未通过服务进行身份验证"错误.对此的解决方案是最简单的:只需将binding ="wsHttpBinding"更改为服务的web.config中的binding ="basicHttpBinding"和客户端的web.config(或者在更改服务的web.config后重新运行svcutil).
web.config最终看起来像这样:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<serviceHostingEnvironment>
<baseAddressPrefixFilters>
<add prefix="http://test.com.cws1.my-hosting-panel.com"/>
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
<services>
<service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="SimpleServiceBehavior">
<!-- This endpoint is exposed at the base address provided by host: http://localhost/servicemodelsamples/service.svc -->
<endpoint address=""
binding="basicHttpBinding"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
<!-- The mex endpoint is explosed at http://localhost/servicemodelsamples/service.svc/mex -->
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="SimpleServiceBehavior">
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true" policyVersion="Policy15" />
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
<system.web>
<customErrors mode="Off"/>
</system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
57914 次 |
最近记录: |