سؤال

هذا رسم بلدي TransferController الدرجة.

كل هذا هو ويب API البرمجية.

public class TransferController : ApiController
{
  [HttpGet, ActionName("Queue")]
  public IEnumerable<object> GetQueue(Guid sessionId) {...}

  [HttpDelete, ActionName("Delete")]
  public void Delete(Guid sessionId, Guid fileId) {...}

  [HttpGet, ActionName("Cancel")]
  public bool Cancel(Guid sessionId, Guid fileId) {...}

  [HttpGet, ActionName("UploadedBytes")]
  public long GetUploadedByteCount(Guid sessionId, Guid fileId) {...}

  [HttpGet, ActionName("DownloadUrl")]
  public string GetDownloadUrl(string fileId) {...}

  [HttpPost, ActionName("FileChunk")] 
  public void PostFileChunk([FromUri]Guid sessionId, [FromUri]Guid fileId) {...}

  [HttpPost, ActionName("UploadDefinition")]
  public Guid PostUploadItem([FromBody]UploadDefinition uploadDef) {...}

}

هذا هو التوجيه.

public static void Register(HttpConfiguration config)
{
  config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{action}"
    );
  config.Routes.MapHttpRoute(
    name: "DefaultApiDefaultMethod", 
    routeTemplate: "api/{controller}"
    );
}

هذا هو الاحتجاج.

$.ajax({
  url: "api/Transfer/Queue",
  data: { sessiondId: login.SessionId() }    
})
.done(function (result) {
  history.push(new UploadItem());
  for (var i = 0; i < result.length; i++) {
    var ui = new UploadItem(result[i]);
    history.push(ui);
  }
})
.fail(function (result) {
  app.showMessage(JSON.parse(result.responseText).Message);
});

وهذه هي النتيجة.

No HTTP resource was found that matches the request URI 'http://localhost:54770/api/Transfer/Queue?sessiondId=0e2c47b9-e674-446d-a06c-ce16932f9580'.

هذا رسم بلدي UserController الدرجة.

public class UserController : ApiController 

  [HttpGet, ActionName("Authenticate")]
  public object Authenticate(string email, string password) {...}

  [HttpPost]
  public void Register([FromBody]UserDefinition userDef) {...}

  [HttpGet, ActionName("Pulse")]
  public bool Pulse(Guid sessionId) {...}

}

لأسباب غير مفهوم بالنسبة لي, ليس لدي أي مشكلة في استدعاء أي شيء في UserController.المعلمات تنظيمها في بالضبط بنفس الطريقة ، نفس طرق في استخدام.


داريل ميلر أدناه يستخدم وحدة اختبار للتحقق من صحة الطرق.بصراحة انا الوم نفسي على عدم التفكير في هذا, و الآن لقد فعلت الشيء نفسه.

ولكن الاختبارات كما انه يظهر لهم حقا اختبار فقط تحليل URL.على سبيل المثال, هذا اختبار يمر

public void TestMvc4RouteWibble()
{
  var config = new HttpConfiguration();
  config.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{action}/{id}",
      defaults: new { id = RouteParameter.Optional }
      );


  var route =
      config.Routes.GetRouteData(new HttpRequestMessage()
      {
        RequestUri = new Uri("http://localhost:54770/api/Transfer/Wibble?sessionId=0e2c47b9-e674-446d-a06c-ce16932f9580&fileId=0e2c47b9-e674-446d-a06c-ce16932f9581")  //?
      });

  Assert.IsNotNull(route);
  Assert.AreEqual("Transfer", route.Values["controller"]);
  Assert.AreEqual("Wibble", route.Values["action"]);

}

على الرغم من غياب واضح من طريقة Wibble على نقل وحدة تحكم.

أيضا الطريق الكائن في HttpRoute كائن انها HttpRouteData الكائن.ولكن هذا مسلي تصحيحها.على HttpRoute كائن المتاحة كما HttpRouteData الكائن.

public void TestMvc4RouteWibble()
{
  var config = new HttpConfiguration();
  config.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{action}/{id}",
      defaults: new { id = RouteParameter.Optional }
      );


  var routeData =
      config.Routes.GetRouteData(new HttpRequestMessage()
      {
        RequestUri = new Uri("http://localhost:54770/api/Transfer/Wibble?sessionId=0e2c47b9-e674-446d-a06c-ce16932f9580&fileId=0e2c47b9-e674-446d-a06c-ce16932f9581")  //?
      });

  Assert.IsNotNull(routeData);
  Assert.AreEqual("Transfer", routeData.Values["controller"]);
  Assert.AreEqual("Wibble", routeData.Values["action"]);

}

وهو بدوره له خاصية معالج.ولكن هذا هو أقل إفادة من أنه قد يكون ، منذ فارغة معالج يعني ببساطة (من MSDN)

إذا null ، الافتراضي معالج ترسل رسائل إلى تطبيقات IHttpController.

الآن بلدي تحكم مشتق من ApiController والتي بالتأكيد تنفذ ExecuteAsync طريقة هذا هو الشيء الوحيد المحدد من قبل IHttpController واجهة.الذي أتصور يعني أنا يمكن تنفيذ اختبار هذا الأسلوب إذا كنت أعرف المزيد عن ذلك.

هل كانت مفيدة؟

المحلول 2

ثم موافق...شكرا على وضع اختبار وحدة الفكرة في رأسي, هذا يساعدنا كثيرا.

هنا هي المعلومات الداخلية:

هل يمكن أن يكون مطابق المعلمة التوقيعات على الأفعال المختلفة (الحصول على وظيفة وضع أو حذف).

لك لا متطابقة المعلمة التوقيعات على عمل مختلفة الأسماء على نفس الفعل.

تحتاج فقط تختلف واحد اسم المعلمة.

لذلك هذا هو موافق لأنهم جميعا على مختلف الأفعال

[HttpDelete, ActionName("Delete")]
public void Delete(Guid sessionId, Guid fileId) {...}

[HttpGet, ActionName("Cancel")]
public bool Cancel(Guid sessionId, Guid fileId) {...}

[HttpPost, ActionName("FileChunk")] 
public void PostFileChunk(Guid sessionId, Guid fileId) {...}

ولكن ليس هذا هو بارد لأن كلاهما يحصل

[HttpGet, ActionName("UploadedBytes")]
public long GetUploadedByteCount(Guid sessionId, Guid fileId) {...}

[HttpGet, ActionName("Cancel")]
public bool Cancel(Guid sessionId, Guid fileId) {...}

و يمكنك إصلاحه مثل هذا

[HttpGet, ActionName("UploadedBytes")]
public long GetUploadedByteCount(Guid sessionId, Guid uploadBytesFileId) {...}

[HttpGet, ActionName("Cancel")]
public bool Cancel(Guid sessionId, Guid cancelFileId) {...}

ربما أكون قاسيا ولكن بقدر ما أنا قلق أنها ليست التوجيه حتى ما يسمى طريقة.

نصائح أخرى

هنا هو اختبار يوضح أعمال التوجيه موافق،

giveacodicetagpre.

وهنا اختبار يظهر أن اختيار الإرسال / الإجراء يعمل أيضا،

giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top