2

我是 WCF 的新手。

我在下面编写了以下服务,运行良好。然后我配置了 IIS,并通过浏览器http://localhost/WCF_Entity_SVC/ProductService.svc运行服务,运行良好。我创建了一个 ASP.Net 网页并使用 url 添加了一个服务引用。当我运行 ASP 页面时,我收到一个内部错误。任何帮助表示赞赏。

public class ProductService : IProductService
    {
        public Product GetProduct(int id)
        {
            NorthwindEntities context = new NorthwindEntities();
            var productEntity = (from p
                                 in context.ProductEntities
                                 where p.ProductID == id
                                 select p).FirstOrDefault();
            if (productEntity != null)
                return TranslateProductEntityToProduct(productEntity);
            else
                throw new Exception("Invalid product id");
        }
        private Product TranslateProductEntityToProduct(
              ProductEntity productEntity)
        {
            Product product = new Product();
            product.ProductID = productEntity.ProductID;
            product.ProductName = productEntity.ProductName;
            product.QuantityPerUnit = productEntity.QuantityPerUnit;
            product.UnitPrice = (decimal)productEntity.UnitPrice;
            product.Discontinued = productEntity.Discontinued;
            return product;
        }
    }

ASP 代码

 public partial class _Default : System.Web.UI.Page
    {
        myService.ProductServiceClient objService = new ProductServiceClient();

        protected void Page_Load(object sender, EventArgs e)
        {
           var results = objService.GetProduct(45);   //debug shows internal error
           dgResult.DataSource = results;
           dgResult.DataBind();

        }
    }

将调试添加到 webconfig 会显示以下错误:

The underlying provider failed on Open. 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

        Exception Details: System.ServiceModel.FaultException`1[[System.ServiceModel.ExceptionDetail, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]: The underlying provider failed on Open.

        Source Error: 


        Line 159:        
        Line 160:        public ASPWFC.myService.Product GetProduct(int id) {
        Line 161:            return base.Channel.GetProduct(id);
        Line 162:        }
        Line 163:    }

    Source File: D:\My Documents\Visual Studio 2010\Projects\wcf\WCF_Entity\ASPWFC\Service References\myService\Reference.cs    Line: 161 

    Stack Trace: 


    [FaultException`1: The underlying provider failed on Open.]
       System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) +9464367
       System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) +345
       ASPWFC.myService.IProductService.GetProduct(Int32 id) +0
       ASPWFC.myService.ProductServiceClient.GetProduct(Int32 id) in D:\My Documents\Visual Studio 2010\Projects\wcf\WCF_Entity\ASPWFC\Service References\myService\Reference.cs:161
       ASPWFC._Default.Page_Load(Object sender, EventArgs e) in D:\My Documents\Visual Studio 2010\Projects\wcf\WCF_Entity\ASPWFC\Default.aspx.cs:23
       System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +37
       System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +95
       System.Web.UI.Control.OnLoad(EventArgs e) +145
       System.Web.UI.Control.LoadRecursive() +134
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3412

出于调试目的,我向服务添加了一个名为 Getparams(int id) 的函数,该函数所做的只是返回 id。我在 ASp 页面中调用了 Getparams 函数,并取回了传递的参数。我认为这意味着 GetProduct 函数中的参数正在传递给服务,并且在实体查询的链接中的某处是错误。

我不明白的是为什么当我直接运行服务时,没有错误。数据库给了我一个结果

我做了一些更多的调试,我发现打开错误的原因是:

sqlError: IIS AppPool\ASP.Net4 登录失败

我该如何解决这个问题,我的 sqlserver 通过 Windows 身份验证运行。

我在 msdn 中找到了一个修复安全问题的脚本,并且该代码可以正常工作

CREATE LOGIN [IIS APPPOOL\ASP.NET v4.0] 
  FROM WINDOWS WITH DEFAULT_DATABASE=[Northwind], 
  DEFAULT_LANGUAGE=[us_english]
GO
CREATE USER [NWUser] 
  FOR LOGIN [IIS APPPOOL\ASP.NET v4.0]
GO
EXEC sp_addrolemember 'db_datareader', 'NWUser'
GO
4

1 回答 1

4

在调试 WCF 服务时,它确实有助于启用跟踪。这使您可以诊断模糊消息(“500 内部服务器错误”并没有真正给出太多信息),而不会产生太多混乱。

转到此处: http: //msdn.microsoft.com/en-us/library/ms732023.aspx以查看详细信息。简而言之,添加

<system.diagnostics>
    <trace autoflush="true" />
    <sources>
            <source name="System.ServiceModel" 
                    switchValue="Information, ActivityTracing"
                    propagateActivity="true">
            <listeners>
               <add name="sdt" 
                   type="System.Diagnostics.XmlWriterTraceListener" 
                   initializeData= "c:\temp\wcfserver.log" />
            </listeners>
         </source>
    </sources>
</system.diagnostics>

发送给您的客户端、服务器或两者;根据需要调整日志文件名initializeData

运行您的程序,您应该会看到一两个日志文件。使用 Service Trace Viewer(Windows SDK 的一部分,随更高版本的 Windows 一起安装)打开它们,您应该会看到以红色突出显示的异常。

WCF 引发的异常,尤其是内部异常,通常是非常明确的,因此这绝对是值得的。

(这也适用于System.Runtime.Serialization最近几次救了我的培根。)

于 2011-11-05T22:11:34.670 回答