我的休息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)
{
}
});
我能够将响应.StatusCode作为NotFound,甚至当我检查fiddler 该服务根本没有点击时我验证了服务网址 在作曲家我得到错误 “ HTTP / 1.1 405方法不允许”
甚至当我尝试使用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方法不允许”但至少在这种情况下按照fiddler
显示服务PFB webconfig的相同......
<?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="data source=<servername>;initial catalog=<catalog>;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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)]
正在服务中
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
在webconfig中获取错误因为服务无法激活,因为它不支持ASP.NET兼容性。为此应用程序启用了ASP.NET兼容性。在web.config中关闭ASP.NET兼容模式,或者将AspNetCompatibilityRequirements属性添加到服务类型,其RequirementsMode设置为“Allowed”或“Required”。
实际上,当我在localhost中运行服务时它工作正常,但是当我托管服务时它会抛出错误..请帮助....
答案 0 :(得分:1)
[WebInvoke(... , Method = "POST" ... )]List<MeasureData> GetKpiMeasureData(DomainData data);
以上代码使用了POST方法,但必须使用GET方法因为如果要添加数据,只使用POST方法。
Http动词是POST,GET,Delete和PUT(更新)。你必须先学习。
I used Get method and RestSharp.dll for my project 如果你想将我的项目用于POST方法,可以使用下面的代码
客户端
var client1 = new RestClient("http://localhost:61111/Service1.svc");
var request1 = new RestRequest("/AddPerson", Method.POST);
Person person1 = new Person();
person1.PersonID = 2;
person1.Name = "Robert";
person1.SurName = "Dan";
JsonSerializer serial = new JsonSerializer();
string temp = serial.Serialize(person1);
Console.WriteLine(temp);
Person tempPerson1 = new JavaScriptSerializer().Deserialize<Person>(temp);
Console.WriteLine(tempPerson1.PersonID + " " + tempPerson1.Name + " " + tempPerson1.SurName);
服务器端
public class Service1 : IService1
{
private Person person = new Person() { PersonID = 1, Name = "John", SurName = "Albert" };
public Person GetPerson()
{
return person;
}
public Person AddPerson(Person person)
{
return person;
}
}
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebInvoke(Method="GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "/GetPerson")]
Person GetPerson();
[OperationContract]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, UriTemplate = "/AddPerson")]
Person AddPerson(Person person);
}
答案 1 :(得分:0)
看看这段代码
我的服务器代码如下
[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"]