Tag: rest

从RESTful WCF服务返回映像

我有这个非常简单的DTO: [DataContract] public class DTO { [DataMember] public byte[] Image {get; set; } } 这个非常简单的服务: [ServiceContract] public interface IFooService { [WebGet( UriTemplate = “”, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] List GetDTOs(); } 在我的global.asax中,我有: RouteTable.Routes.Add(new ServiceRoute(“foo”, new WebServiceHostFactory(), typeof(FooService))); 现在,当我从浏览器调用它时,我得到一个JSON格式的字节数组。 目前很好。 现在,如何将该字节数组转换为图像? 或者,有没有更好的方法来解决这个问题? 我尝试将byte[]更改为Stream ,但是当我从Firefox调用该服务时,尽管HTTP状态代码为200,但响应为空。我正在使用Firebug和Fiddler。 我不认为它是相关的,但由于太多的信息从来没有伤害任何不是机器人的人,这里是web.config: 最后,我想问题是:如何从WCF RESTful服务返回位图,以便在浏览器中运行的JavaScript可以在屏幕上抛出它?

如何使用Microsoft ASP.NET Web API OData中的Delta 和Code First \ JsonMediaTypeFormatter

有什么问题? 我正在尝试在我的ASP.net web api应用程序中启用修补程序。 我正在使用代码第一entity framework。 我有以下方法标题,我可以设置一个断点,它将命中: [AcceptVerbs(“PATCH”)] public async Task Patch(long appId, long id, Delta formGroup) 但是,当我调用formGroup.Patch(实体)时,不会对我的实体进行任何更改。 如果我将以下内容放入即时窗口: formGroup.GetChangedPropertyNames() 然后这个集合是空的,这似乎是错误的。 我试过了什么? 我一直在提到以下例子 http://techbrij.com/http-patch-request-asp-net-webapi http://www.strathweb.com/2013/01/easy-asp-net-web-api-resource-updates-with-delta / Json MediaType Formatter似乎不知道如何正确构建Delta对象,但是在第二个链接中,filip似乎表明它应该在没有oDataMediaTypeFormatter的情况下工作。 我已经开始试图将我的模型序列化为EDMX表示,然后从那里提取CSDL以便我可以创建一个oDataMediaTypeFormatter,但我也遇到了障碍,加上它似乎有点矫枉过正。 如果有人能够对此有所了解,那将非常感激。 如果需要更多信息,请与我们联系。 编辑: 这是SimpleFormGroup的类定义: public class SimpleFormGroup { public int LastUpdate; public string Identifier; public string Title; public int DisplayOrder; } 这是我发送的数据: Content-Type: ‘application/json’ { […]

C#如何将HttpClient Keep-Alive设置为false

我在.NET上的HTTP请求有一个低性能问题。 对localhost上的REST API的HTTP GET请求大约需要500毫秒才能完成。 我花了很多时间来解决它。 我尝试了很多方法: HttpClient , HttpWebRequest , WebClient和RestSharp 。 他们都没有工作。 互联网上的大多数解决方案都表示将Proxy参数设置为null但仍然无法更快地运行。 我发现减少这个时间的唯一方法是将请求的Keep-Alive参数设置为false: HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.Method = “GET”; request.KeepAlive = false; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 这很好用。 时间减少到7-10毫秒。 但现在由于某些原因,我需要使用HttpClient而不是HttpWebRequest 。 我无法找到如何为HttpClient设置Keep-Alive为false。 我发现的唯一一件事是如何通过将“连接”标题设置为“保持活动”来将其设置为true。 我在HttpClient上使用此代码进行POST请求: HttpClient _http = new HttpClient(); _http.DefaultRequestHeaders.Accept.Clear(); _http.DefaultRequestHeaders.Add(“Connection”, “Keep-Alive”); _http.DefaultRequestHeaders.Add(“Keep-Alive”, “timeout=600”); var content = new StringContent( request, Encoding.UTF8, “application/%appname%+xml”); content.Headers.ContentType.Parameters.Add( […]

ASP.net Web API中MVC的DefaultModelBinder的等价物是什么?

我想在ASP.Net Web API中创建一个自定义模型绑定器。 有关如何从头开始执行此操作的大量资源,但我想利用现有function。 我在codeplex中查看了源代码,并且可以在那里看到大量的模型绑定器,但大多数是密封的……即使这样,我也无法确定在哪种情况下使用哪一个。 这是我的api方法标题: public async Task Post(long appId, [FromBody]Field field) 我想要做的是基本上在填充所有基本属性后拦截模型绑定器,然后根据我将在客户端设置的http请求标头设置一些额外的值。 正如我所说,我很乐意创建自定义模型绑定器和模型绑定器并将它们连接起来,我遇到问题的是试图重新使用现有的function。 谢谢,皮特

如何在不缓冲的情况下从WCF流式传输响应?

我有一个restful(webHttpBinding)自托管WCF服务。 大多数方法都将xml或json版本的对象返回给客户端。 我有几个触发长时间运行方法的GET方法,我想将日志响应流式传输到浏览器(或应用程序),以便用户知道发生了什么。 使用HttpContext.Current.Response.OutputStream.Write可以很容易地实现这一点。 不幸的是, HttpContext.Current在自托管WCF服务中始终为null,即使我包含aspNetCompatibilityEnabled配置(遗憾的是IIS不是一个选项)。 我尝试过AnonymousPipeServerStream : WCF和流请求和响应 以及第一个设置: OutgoingWebResponseContext context = WebOperationContext.Current.OutgoingResponse; context.ContentType = “text/plain”; 这样响应进入浏览器就不会将流下载到文件中进行保存。 在Chrome中它根本不起作用 – 它会缓冲到最后。 在IE或wget中,它似乎一次缓冲大约4k(或其他东西)。 这对于日志记录没有好处,除非我吐出大量不必要的日志消息来强制输出,用户并不真正知道发生了什么。 我只能假设这是因为响应实际上是一个分块响应而且块是4k(而不是只写入输出流)。 将chrome输出到输出的修复显然是在发送分块响应之前给内容写了一些垃圾: Chunked transfer encoding – 浏览器行为 ,但是,我不认为这对于WCF是可能的。 那么,我正在寻找可能的解决方案: 一种在自托管服务(无IIS)中写入WCF中的输出流的方法。 要么 一种控制流响应中的块大小的方法(以及首先编写一些内容以便Chrome将呈现块的方式)。 我认为另一种选择是放弃WCF,转而支持更友好的REST(我开始认为WCF不是正确的选择)。 但是,现在在WCF中写了这么多,这似乎是一项乏味的任务。 除非有一些我可以切换到的东西,这将是一个简单的迁移(例如,如果我可以重用相同的服务类,可能只有不同的属性)。 南希也许?

如何将多个args传递/接收到RESTful Web API GET方法?

接收参数(返回标量值而不是数据集)的GET RESTful方法的常见示例如下所示: public string Get(int id) { //get and return the value } …传递的val通常是一个ID,因此您可以使用它来获取基于该唯一值的标量值。 但是,如果要传递多个值,例如字符串和int,该怎么办? 这只是定义一个这样的方法的问题: public string Get(string someString, int someInt) { //get and return the value } ……并且这样称呼它: //const string uri = “http://192.112.183.42:80/api/platypusItems/someString/someInt”;, zB: const string uri = “http://192.112.183.42:80/api/platypusItems/DuckbilledPlatypisAreGuysToo/42”; var webRequest = (HttpWebRequest) WebRequest.Create(uri); ? IOW,路由机制是否会发现,由于传递了两个args,它应该使用两个args(“约定优于配置”)调用Get()方法,还是需要做更多的事情才能正确地路由事物?

ServiceStack支持在每次调用的基础上有条件地忽略REST响应中的字段

至少,我正在寻找一种方法来有条件地排除资源上的某些属性,使其不被包含在每个呼叫的响应中(参见下面的fields )。 理想情况下,我想使用ServiceStack实现REST服务,该服务支持以下所有要点。 UPDATE 虽然我一般都非常喜欢ServiceStack的方法,但如果可能的话,我更愿意使用它,如果它不是特别适合这些想法,我宁可不要向后弯腰,让它变得有效。 如果是这样的话,任何人都可以指向另一个可能更合适的c#框架吗? 当然,我正在积极探索其他选择。 在本次题为“ 设计REST + JSON API ”的演讲中,演示者在JSON中描述了他的资源引用策略(通过资源上的href属性)。 除此之外,他还描述了两个查询参数( fields和expand ),用于控制调用REST服务的响应所包含的数据。 我一直在努力尝试挖掘ServiceStack框架以获得对fields支持,但迄今为止一直没有成功。 这在ServiceStack目前是否可行? 理想情况下,解决方案将与格式无关,因此可以使用所有ServiceStack支持的输出格式。 我认为expand将采用相同的策略。 我将在这里描述这些function,但我认为链接上的谈话可以更好地解释它们。 假设我们有一个Profiles资源,其中包含以下属性: givenName , surname , gender和favColor 。 “个人档案”资源还包括用户在socialNetworks属性中所属的社交网络列表。 href – (video中的42:22)每个资源都包含REST服务上的完整链接。 将返回对GET /profiles/123调用 { “href”:”https://host/profiles/123″, “givenName”:”Bob”, “surname”:”Smith”, “gender”:”male”, “favColor”:”red”, “socialNetworks”: { “href”:”https://host/socialNetworkMemberships?profileId=123″ } } 请注意, socialNetworks属性返回的对象仅填充了href值。 这样可以使响应更短且更集中,同时还为最终用户提供足够的信息,以便在需要时提供进一步的请求 在这个庄园中全面使用的href属性使得重用资源数据结构作为其他资源的子项变得容易(概念上无论如何)。 fields – (video中55:44)查询字符串参数,指示服务器仅在REST响应中包含所需资源的指定属性。 GET /profiles/123正常响应将包括资源的所有属性,如上所示。 当fields查询参数包含在请求中时,仅返回指定的字段。 […]

使用WCF Rest服务下载文件?

如果有一种方法使用rest via stream上传文件,还会有“ Download ”吗? 如果是的话,你能告诉我怎么样? 提前致谢!

RestSharp – 授权标头未涉及WCF REST服务

我试图通过基本身份validation通过HTTPS调用本地托管的WCF REST服务。 这是有效的,授权标题通过就好了,所有人都很高兴: ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertficate; var request = (HttpWebRequest)WebRequest.Create(“https://localhost/MyService/MyService.svc/”); request.Method = “GET”; request.ContentType = “application/json”; request.Headers.Add( System.Net.HttpRequestHeader.Authorization, “Basic ” + this.EncodeBasicAuthenticationCredentials(“UserA”, “123”)); WebResponse webResponse = request.GetResponse(); using (Stream webStream = webResponse.GetResponseStream()) { if (webStream != null) { using (StreamReader responseReader = new StreamReader(webStream)) { string response = responseReader.ReadToEnd(); } } } 但是,当我尝试使用RestSharp时,Authorization标头永远不会通过请求: ServicePointManager.ServerCertificateValidationCallback = […]

asp web api补丁实现

假设我有这个模型 public partial class Todo { public int id { get; set; } public string content { get; set; } public bool done { get; set; } } 我将此作为json数据发送到我的控制器作为补丁请求。 这绝对是一个复选框的动作。 我认为我只想把它发送到我的服务器,而不是整个模型。 { “id”:1, “done” : true } 为了正确处理这个简单的json补丁请求,我的WebApi控制器需要看起来是什么样的? 我应该使用web api,还是应该使用更多rpc风格的mvc方法? 这似乎是一件非常基本的事情,但我似乎无法做到正确! 我想我可能需要在我的控制器方法中使用不同的参数,但我不确定。 感谢您的时间。