2

私はWCFが初めてです。

以下のサービスを書きましたが、正常に動作します。次に、IIS を構成し、ブラウザーhttp://localhost/WCF_Entity_SVC/ProductService.svcを介してサービスを実行しました。正常に動作します。ASP.Net Web ページを作成し、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 関数のパラメーターがサービスに渡され、エンティティ クエリへのリンクのどこかにエラーがあることを意味すると思います。

私が理解していないのは、サービスを直接実行してもエラーが発生しない理由です。データベースは私に結果を与える

さらにデバッグを行ったところ、open エラーの理由は次のとおりであることがわかりました。

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 Internal Server Error」は実際にはあまり意味がありません) を大騒ぎせずに診断できます。

詳細を確認するには、 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

プログラムを実行すると、1 つまたは 2 つのログ ファイルが表示されます。サービス トレース ビューアー (Windows SDK の一部で、新しいバージョンの Windows と共にインストールされます) でそれらを開くと、赤で強調表示された例外が表示されます。

WCF によって発生する例外、特に内部例外は通常非常に明示的であるため、これは間違いなく努力する価値があります。

(これはSystem.Runtime.Serialization、最近私のベーコンを数回保存した場合にも機能します。)

于 2011-11-05T22:11:34.670 に答える