1

以下のように私の残りのwcfサービス...

[ServiceContract]
public interface IWinPhoneService
{

[OperationContract]
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "getkpimeasuredata", Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped)]
List<MeasureData> GetKpiMeasureData(DomainData data);


[OperationContract]
[WebGet(UriTemplate = "getdata/{value}", ResponseFormat = WebMessageFormat.Json)]
string GetData(string value);


// TODO: Add your service operations here
}

[DataContract]
public class DomainData
{
    [DataMember]
    public int? KPIId
    {
        get;
        set ;
    }

[DataMember]
public int? ScorecardId
{
    get;
    set;
}

[DataMember]
public short? CumulativeMonth
{
    get;
    set;
}

[DataMember]
public int? EngineeringOrgId
{
    get;
    set;
}

[DataMember]
public int? BusinessOrgId
{
    get;
    set;
}
[DataMember]
public int? DataValuetypeId
{
    get;
    set;
}

}

以下のようにRestsharpを使用してこのサービスを利用すると

string URL = "http://<servername>:8085/WinPhoneService.svc";

            RestClient client = new RestClient(URL);

            RestRequest request = new RestRequest("getkpimeasuredata",Method.POST);
            DomainData data = new DomainData();
            data.KPIId = 1006;
            data.ScorecardId = 3;
            data.EngineeringOrgId = 11;
            data.DataValuetypeId = 1;
            data.CumulativeMonth = 463;
            data.BusinessOrgId = 1;

            string json = Newtonsoft.Json.JsonConvert.SerializeObject(data);

            json = "{\"data\" : " + json + "}";

            request.AddParameter("application/json; charset=utf-8", json, ParameterType.RequestBody);
            request.RequestFormat = DataFormat.Json;
 client.ExecuteAsync(request, response =>
            {
                if (response.StatusCode == HttpStatusCode.OK)
                {



                }
                else
                {
                    //NOK
                }
            });

以下のようにwebgetメソッドも試してみました..

 RestClient client1 = new RestClient(URL);
            RestRequest request1 = new RestRequest(string.Format("getdata/{0}", 1), Method.GET);
            request1.RequestFormat = DataFormat.Json;

            var x = client1.ExecuteAsync(request1, response =>
                {
                    if (response.StatusCode == HttpStatusCode.OK)
                    {

                    }
                });

Response.StatusCode を NotFound として取得できます。フィドラーをチェックしてもサービスがまったくヒットせず、composer im でサービスの URL を確認すると、「HTTP/1.1 405 Method Not Allowed」というエラーが表示されます。

以下のようにWebclientで試したときでも

string URL = "http://<servername>:8085/WinPhoneService.svc";
            WebClient wclient = new WebClient();
            wclient.UseDefaultCredentials = true;
            wclient.Headers["Content-Type"] = "application/json";


            DomainData kpidata = new DomainData();
            data.KPIId = 1006;
            data.ScorecardId = 3;
            data.EngineeringOrgId = 11;
            data.DataValuetypeId = 1;
            data.CumulativeMonth = 463;
            data.BusinessOrgId = 1;

            string json = SerializeJson(kpidata);
            String str = wclient.UploadString(new Uri(URL ),"getkpimeasuredata",json);

ここでも「HTTP/1.1 405 Method Not Allowed」が表示されますが、少なくともこの場合、フィドラーに示されているようにサービスにヒットします

同じのwebconfigをPFB...

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation>
      <assemblies>
        <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </assemblies>
    </compilation>
    <!--<httpRuntime targetFramework="4.0" />-->
  </system.web>
  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="webCorpBinding">
          <!--<security mode="TransportCredentialOnly">
            <transport clientCredentialType="Windows"></transport>
          </security>-->
        </binding>
      </webHttpBinding>

    </bindings>
    <behaviors>

      <endpointBehaviors>
        <behavior name="RESTCorpBehavior">
          <webHttp/>
        </behavior>

      </endpointBehaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true"  />
          <!-- 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>
    <services>
      <service name="WinPhoneService.WinPhoneService">
        <endpoint name="WinPhoneServiceeCorp" address="" binding="webHttpBinding" bindingConfiguration="webCorpBinding" behaviorConfiguration="RESTCorpBehavior"
         contract="WinPhoneService.IWinPhoneService" />
      </service>
    </services>
    <!--<protocolMapping>
      <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>-->
    <!--<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />-->
  </system.serviceModel>
  <!--<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    --><!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      --><!--
    <directoryBrowse enabled="true" />
  </system.webServer>-->


  <connectionStrings>
    <add name="ScaasEntities" connectionString="metadata=res://*/Scaas.csdl|res://*/Scaas.ssdl|res://*/Scaas.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=<servername>;initial catalog=<catalog>;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>
</configuration>

同じことに関して私を助けてください..

win8モバイルアプリで使用する機能は

public async void  LoadKpiData()
        {
                       string URL = "http://rr1biscdevsql01:8085/WinPhoneService.svc/getkpimeasuredata;
            WebClient wclient = new WebClient();
            wclient.UseDefaultCredentials = true;
            wclient.Headers["Content-Type"] = "application/json";

            DomainData kpidata = new DomainData();
            kpidata.KPIId = 1006;
            kpidata.ScorecardId = 3;
            kpidata.EngineeringOrgId = 11;
            kpidata.DataValuetypeId = 1;
            kpidata.CumulativeMonth = 463;
            kpidata.BusinessOrgId = 1;

            string json = SerializeJson(kpidata);
            wclient.UploadStringAsync(new Uri(URL), json);

            wclient.UploadStringCompleted += (s, e) =>
                {

                };

        }

そして、Restclient呼び出しの応答をチェックすると、以下のようなエラーが発生しました

 {"ErrorCode":"1001","ErrorMessage":"System.Data.EntityCommandExecutionException: The data reader is incompatible with the specified 'ScaasModel.GetKPIMeasureData_Result'. A member of the type, 'ParamName', does not have a corresponding column in the data reader with the same name.\u000d\u000a   at System.Data.Query.InternalTrees.ColumnMapFactory.GetColumnMapsForType(DbDataReader storeDataReader, EdmType edmType, Dictionary`2 renameList)\u000d\u000a   at System.Data.Query.InternalTrees.ColumnMapFactory.CreateColumnMapFromReaderAndType(DbDataReader storeDataReader, EdmType edmType, EntitySet entitySet, Dictionary`2 renameList)\u000d\u000a   at System.Data.Query.InternalTrees.ColumnMapFactory.CreateFunctionImportStructuralTypeColumnMap(DbDataReader storeDataReader, FunctionImportMapping mapping, EntitySet entitySet, StructuralType baseStructuralType)\u000d\u000a   at System.Data.EntityClient.EntityCommandDefinition.FunctionColumnMapGenerator.System.Data.EntityClient.EntityCommandDefinition.IColumnMapGenerator.CreateColumnMap(DbDataReader reader)\u000d\u000a   at System.Data.Objects.ObjectContext.CreateFunctionObjectResult[TElement](EntityCommand entityCommand, EntitySet entitySet, EdmType edmType, MergeOption mergeOption)\u000d\u000a   at System.Data.Objects.ObjectContext.ExecuteFunction[TElement](String functionName, MergeOption mergeOption, ObjectParameter[] parameters)\u000d\u000a   at System.Data.Objects.ObjectContext.ExecuteFunction[TElement](String functionName, ObjectParameter[] parameters)\u000d\u000a   at ScaasWinPhone.Model.ScaasEntities.GetKPIMeasureData(Nullable`1 kPIID, Nullable`1 scorecardID, Nullable`1 cumulativeMonthCount, Nullable`1 engineeringOrgID, Nullable`1 businessOrgID, Nullable`1 dataValueTypeID, Nullable`1 debug, ObjectParameter errorText)\u000d\u000a   at ScaasWinphoneRepository.ScaasRepository.GetKpiMeasureData(Nullable`1 kpiId, Nullable`1 scorecardId, Nullable`1 cumulativeMonth, Nullable`1 engineeringOrgId, Nullable`1 businessOrgId, Nullable`1 dataValuetypeId)\u000d\u000a   at SCaaSWinPhoneService.SCaaSWinPhoneService.GetKpiMeasureData(KpiDomainData kpidata)"}

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]サービスを追加したときの Rajesh と

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

ASP.NET互換性をサポートしていないため、サービスをアクティブにできません。このアプリケーションでは、ASP.NET 互換性が有効になっています。web.config で ASP.NET 互換モードをオフにするか、AspNetCompatibilityRequirements 属性をサービス タイプに追加して、RequirementsMode 設定を 'Allowed' または 'Required' に設定します。

実際には、ローカルホストでサービスを実行すると正常に動作しますが、サービスをホストするとエラーがスローされます..助けてください....

4

2 に答える 2

1

このコードを見てください

以下のような私のサーバーコード

[ServiceContract]
    public interface IWinPhoneService
    {
        [OperationContract]
        [WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "getkpimeasuredata")]
        List<String> GetKpiMeasureData(DomainData data);
    }

[DataContract]
    public class DomainData
{
    [DataMember]
    public int? KPIId { get; set; }

    [DataMember]
    public int? ScorecardId { get; set; }

    [DataMember]
    public short? CumulativeMonth { get; set; }

    [DataMember]
    public int? EngineeringOrgId { get; set; }

    [DataMember]
    public int? BusinessOrgId { get; set; }

    [DataMember]
    public int? DataValuetypeId { get; set; }
}

今、以下のようなインターフェースの私の実装

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    public class WinPhoneService : IWinPhoneService
    {
        public List<string> GetKpiMeasureData(DomainData data)
        {
            if (data != null)
            {
                return new List<string>()  {"Sample 1","Sample 2"};
            }
            return new List<string>() {"No data recieved"};
        }
    }

エンドポイント要素構成用のサーバー側 web.config

<system.serviceModel>
<services>
    <service name="WinPhoneService.WinPhoneService">
            <endpoint address="" binding="webHttpBinding" behaviorConfiguration="web" bindingConfiguration="defaultRestJsonp" contract="WinPhoneService.IWinPhoneService">
            </endpoint>
          </service>
    </services>
    <behaviors>
    <endpointBehaviors>
            <behavior name="web">
              <webHttp />
              <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
            </behavior>        
    </endpointBehaviors> 
    </behaviors>
    <bindings>   
    <webHttpBinding>
            <binding name="defaultRestJsonp" crossDomainScriptAccessEnabled="true">
              <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxDepth="64" maxNameTableCharCount="2147483647" />
              <security mode="None" />
            </binding>
  </webHttpBinding>
  </bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />     
 </system.serviceModel>  

上記のすべてのセットで、RestSharpClient を使用して以下のクライアント コードを見つけます。

private static string ToStringUsingDataContractJsonSer<T>(T requestBody)
        {
            var serializer = new DataContractJsonSerializer(typeof(T));
            var ms = new MemoryStream();
            serializer.WriteObject(ms, requestBody);
            ms.Position = 0;
            var reader = new StreamReader(ms);
            return reader.ReadToEnd();
        }

private string UseRestSharpApproach(string serviceBaseUrl, string resourceUrl, Method method, object requestBody)
        {
            var client = new RestClient();
            client.BaseUrl = serviceBaseUrl;
            var request = new RestRequest(method) { DateFormat = DataFormat.Xml.ToString(), Resource = resourceUrl };
            request.AddParameter("application/json", requestBody, ParameterType.RequestBody);            
            var response = client.Execute(request);

            string responseString;
            if (response.StatusCode == HttpStatusCode.OK)
            {
                responseString = HttpUtility.HtmlDecode(response.Content);
            }
            else
            {
                responseString = response.StatusDescription + " --------------------" + HttpUtility.HtmlDecode(response.Content);
            }
            return responseString;
        }

public void CallRESTService()
{
       UseRestSharpApproach(serviceBaseUrl, resourceUrl, Method.POST, ToStringUsingDataContractJsonSer<DomainData>(objDomainData));
}

シリアライゼーションとデシリアライゼーションが問題なく行われるように、クライアント側で使用する場合は DomainData オブジェクトがサーバーと同じ名前空間にあることを確認してください。

Fiddler からの生のリクエストは次のようになります。

POST http://servername/Sample/WinPhoneService.svc/GetKpiMeasureData HTTP/1.1
Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml
User-Agent: RestSharp 102.0.0.0
Content-Type: application/json
Host: servername
Content-Length: 112
Accept-Encoding: gzip, deflate

{"BusinessOrgId":1,"CumulativeMonth":463,"DataValuetypeId":1,"EngineeringOrgId":11,"KPIId":1006,"ScorecardId":3}

そして、応答は次のようになります。

HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 23
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS
X-AspNet-Version: 4.0.30319
Set-Cookie: ASP.NET_SessionId=123450p12rvdmnh3qrx2ocip; path=/; HttpOnly
Date: Tue, 03 Sep 2013 10:11:51 GMT

["Sample 1","Sample 2"]
于 2013-09-03T10:20:53.583 に答える