2

私がホストした WCF ライブラリがあり、ログイン関数はうまく機能しますが、2 番目の関数 ReturnCounter

インターフェイスは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.ServiceModel;
using System.ServiceModel.Web;

namespace PMAService
{
    [ServiceContract]
    public interface IPMA
    {
        [OperationContract]
        string Login(string username, string password);

        [OperationContract]
        List<usp_ReturnEncounter_Result> ReturnEncounter();



    }
}

コードは

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel.Web;
using System.Security.Cryptography;
using System.Web.Security;

namespace PMAService
{
    public class PMA : IPMA
    {

        [WebInvoke(Method = "GET",
   ResponseFormat = WebMessageFormat.Json,
   UriTemplate = "LogIn/{username}/{password}")]
        public string Login(string username, string password)
        {
            if (Membership.ValidateUser(username, password))
                return "true";
            else
                return "false";
        }

        // Method to retrieve the Counter 
        [WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "ReturnEncounter")]
        public List<usp_ReturnEncounter_Result> ReturnEncounter()
        {
            using (PMAEntities context = new PMAEntities())
            {
              return   context.usp_ReturnEncounter().ToList();
            }
        }

    }
}

エンティティ フレームワークに接続する場所

web.config は次のようになります

<?xml version="1.0"?>
<configuration>
  <appSettings/>
  <connectionStrings>
</connectionStrings>
  <system.web>
    <compilation debug="true" targetFramework="4.0"/>
    <roleManager enabled="true" />
    <membership>
      <providers>
        <remove name="AspNetSqlMembershipProvider"/>
        <add name="AspNetSqlMembershipProvider"
             type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
             connectionStringName="Login"
             enablePasswordRetrieval="false"
             enablePasswordReset="true"
             requiresQuestionAndAnswer="false"
             applicationName="/"
             requiresUniqueEmail="false"
             passwordFormat="Hashed"
             maxInvalidPasswordAttempts="5"
             minRequiredPasswordLength="1"
             minRequiredNonalphanumericCharacters="0"
             passwordAttemptWindow="10"
             passwordStrengthRegularExpression="" />
      </providers>
    </membership>

    <authentication mode="Windows"/>
    <customErrors mode="On"/>
  </system.web>
  <system.serviceModel>
    <services>
      <service name="PMAService.PMA">
        <endpoint binding="webHttpBinding" contract="PMAService.IPMA" behaviorConfiguration="web">
        </endpoint>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

login/x/y はうまく機能しますが、ReturnCounter はエンドポイントが見つからないというエラーを返します

それを修正するアイデアがあれば教えてください

4

2 に答える 2

1

WebInvoke を使用する理由

Get 操作を使用するには、このメソッドに WebGet を使用する必要があります。

WebInvoke は、Insert Update Delete 操作を実行するためのものです。それらには POST、PUT、DELETE のメソッド名を使用します。

データを取得する必要がある場合は、そのようなことを行う必要があります。

  [WebGet(UriTemplate = "ReturnEncounter",
 RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]

お気づきのように、要求形式があり、これは WebMessageFormat で列挙された XML または JSON である可能性があります。

事後処理用。WebRequest オブジェクトを使用できます。

希望が役立ちます。

于 2012-10-18T07:29:09.307 に答える
1

まず、サービスでトレースを有効にし、例外の原因を確認します。

また、サーバー側とクライアント側で ReaderQuotas を増やして、より大きなデータが問題なく渡されるようにすることも検討してください。以下にサンプルを示します。

<system.serviceModel>    
<bindings>
<webHttpBinding>
          <binding maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
             <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
                  maxArrayLength="2147483647" maxBytesPerRead="2147483647"
                  maxNameTableCharCount="2147483647" />
            <security mode="None" />
          </binding>
        </webHttpBinding>
</bindings>
</system.serviceModel>   
 

また、エンティティ フレームワークによってフェッチされたオブジェクトを直接渡していることがコードでわかります。エンティティ フレームワーク オブジェクトが逆シリアル化されず、例外が発生する可能性がある状況があります。シンプルな POCO を作成し、フェッチしたデータを入力して POCO を返します。

于 2012-06-07T10:54:36.170 に答える